1. JVM의 메모리 관리

Java 프로그램을 실행하게되면 운영체제로부터 JVM(Java Vitrual Machine)은 메모리를 할당받고 이를 몇가지 영역으로 세분화하여 관리하게됩니다.

 

JVM은 메모리를 메소드 영역(Method Area), 힙 영역(Heap Area), 스레드 단위(Thread)로 구분하여 관리하게됩니다.

 

각가의 영역에서 어떤 데이터들을 관리하는지 알아보겠습니다.

 

 

2. 메소드 영역(Method Area)

메소드 영역에서는 '.class 파일'들을 읽어들여 각각의 클래스별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등을 저장하게됩니다.

 

일반적으로 static으로 선언된 값들 역시 이 과정에서 메소드 영역에 저장되게됩니다.

 

이곳에 생성된 데이터는 JVM이 실행되는 순간에 자동으로 생성됩니다. 프로그래밍 과정에서 아직 수행되지 않은 static 영역의 데이터에 접근할 수 있는 이유도 static으로 선언된 값이 JVM이 실행되는 순간에 메모리에 올라가기 때문입니다.

 

여기에 저장된 값들은 모든 쓰레드가 공유하는 값이라는 것을 유의해야합니다.

 

 

 

3. 힙 영역(Heap Area)

힙 영역은 객체(Object)와 배열(Array)이 사용하는 공간이라고 볼 수 있습니다.

 

객체와 배열의 공통점은 이 두가지를 '참조'를 통해 호출한다는 것에 있습니다. C에서 주소값을 통해 배열에 접근하는 방식과 유사하다고 볼 수 있습니다.

 

Java에서 빠질 수 없는 녀석인 gc(Garbage Collector)가 바로 이 힙 영역에 존재하는 객체와 배열들을 정리하는 역할을 수행합니다.

 

어떠한 곳에서도 참조하는 변수나 필드가 없다면 이것을 쓰레기라고 판단하고 gc가 힙 영역에서 이 객체들을 제거하는 역할을 수행하게됩니다.

 

gc의 존재 덕분에 프로그래머가 객체를 제거하기 위한 코드를 작성할 필요가 없습니다. 다만, gc의 경우 항상 실행되고 있는 것이 아니라 필요에 따라 JVM에의해 실행되기 때문에 필요로 하지 않는 객체가 당분간 힙 영역에 존재하는 경우가 있을 수 있습니다.

 

만약 참조하지 않는 객체를 즉시 gc에 의해 정리하고 싶다면, System.gc();를 통해 gc를 실행시킬 수 있습니다.

 

 

 

4. 스레드(Therad)

JVM은 한 프로그램의 작업단위를 의미하는 스레드(쓰레드) 별로 데이터를 나눠 관리합니다.

 

이는 하나의 스레드에서 관리하는 데이터에 다른 스레드가 접근하지 못하는 일이 없도록 데이터의 관리단위를 나눠주기 위함이라고 생각합니다.

 

하나의 스레드 영역에는 JVM 스택(JVM Stack)이라는 영역이 존재합니다.

 

일반적인 데이터 관리형태와 마찬가지로 Stack 구조를 이용하여 스레드에서 사용하는 변수(지역변수 + 참조타입변수)들을 관리하게됩니다.

 

 

+ Recent posts