JVM메모리 구조

JVM 메모리 구조

JVM 메모리 구조에는 대표적으로 힙 영역과 메소드 영역으로 유명하지만, 실제로 우리 자바 응용 프로그래머들이 알아야할 것들은 생각보다 많다. 전체적으로는 아래와 같다.

heap area

일반적으로 런타임 시에 생성되는 데이터들이 담기는 곳이다.new 생성자 호출을 통해 생성되는 객체들도 여기에 담긴다.(객체도 결국 데이터이고, 객체를 선언한다는 것은 데이터를 담는 자료 구조를 선언한다는 것이다.) heap area 는 지속적으로 GC(가비지 콜렉터)에 의해 해당 데이터가 참조되지 않는 지를 체크해서 할당 해제(청소)를 한다.

static area

구글링 하면 일반적으로 메소드 아레아 라고 많이 얘기하지만, static area 가 정확하다. 이유는 이 녀석이 하는 역활 때문인데, static area 를 보는 관점에 따라서 method area, class area, code area, constant pool 라고 한다. 느낌이 오질 않는다? 소스 상의 변하지 않는 정적인 데이터들이 여기에 담긴다. 런타임 시에 해당 객체의 타입(형이라고도 한다. 즉, class 를 말하는 것이다.)에 대한 정보도 여기서 얻어온다. constant pool 은 대단한 게 아니다. javascript es6 의 const 문법 그것을 의미하는 것과 같다. 즉 상수를 의미하는 데, 대표적인 예로 staing 에 대한 데이터가 여기에 존재한다. 이는 아래에서 자세히 설명한다. 그래서 static(정적) area 라고 하는 것이 옳은 것이다.

stack area(thread area, method call area)

일반적으로 메소드 호출 스택이 들어가는 곳으로 알지만, 사실은 thread 관리를 위한 stack 이다. 자바 어플리케이션은 멀티 스레드 프로그래밍을 하지 않는다면 단일 스레드를 생성해서 프로그램이 돌아가게 된다. 생성 된 스레드는 고유의 관리 메모리 주소를 가지게 되는 데, 이가 stack area에 저장된다. 그리고 각 주소에는 메소드 호출 프레임이라는 스택이 생성된다. 즉 main 메소드를 위한 최초의 스레드의 관리를 위한 메모리가 stack area에 생기게 되고, 해당 스레드 내부의 메소드 콜 스택은 관리 된다. 참고로 이 stack area 의 스레드는 스레드 life cycle 관리를 위한 개별 관리일 뿐이고, static area 나 heap area 에는 어떠한 스레드도 다 접근이 가능하기 때문에 멀티 스레드 환경에서의 코딩기법을 주의해라는 것이다.

실제로 개별 스레드 관리 메모리 내부에 생성되는 메소드 프레임에는 각 호출 메소드 별 스택에 독립적인 변수 관리 메모리가 생성 되는 데, 이곳에서 메소드 내부의 지역 변수가 관리된다. 즉, 멀티스레딩 코딩을 위한 여러 조언들 중에 지역 변수를 사용하라는 의미는 stack area의 개별 스레드 내부의 메소드 프레임 영역에서 변수를 생성해라는 의미와 같다.

native stack area

자바 외의 기능들을 사용하기 위한 곳이다. 자바 외의 기능들은 JNI 라는 java native interface 를 통해 실행 된다. JNI 는 대부분 OS와의 통신을 위한 인터페이스를 담당한다고 생각하면 쉽다. JAVA 의 컨셉인 ‘OS 무관 그냥 실행해’ 라는 의미가 가장 생각나는 곳이다. 일반적인 자바 응용 프로그래머는 신경쓰지 않아도 된다.

pc register

스레드가 생성될 때마다 생기는 공간이다. 스레드를 생성한다는 것은 JVM 이 할당된 독립적인 프로세스 안에서 스레드를 생성한다는 의미인데, pc register는 생성되는 스레드들의 명령 히스토리를 관리하기 위한 곳이다.

레퍼런스