본문 바로가기
Language/Java

[JVM] Java 메모리 구조

by 돈코츠라멘 2019. 9. 5.

JVM

JVM(Java Virtual Machine, 자바 가상 머신)은 자바 바이트 코드를 실행한다. 일부 프로그램(예를 들어 C로 개발된)은 실행되기 위해 OS에 의해 메모리가 제어되며 실행되는 반면 자바 프로그램은 JVM이 OS로부터 메모리를 할당받아 실행하는 구조이다. 덕분에 OS로부터의 종속이 없어서 널리 사용되고 있다. 이론적으로 모든 자바 프로그램은 CPU와 OS의 종류와 무관하게 독립적으로 동작하는 것을 보장한다.

JVM 내부 구조

  • Runtime Data Area: JVM이 프로그램을 수행하기 위해 OS로 부터 할당받은 메모리 공간이다.
  • Class Loader: Runtime에 컴파일러에 의해 변환된 Byte Code(.class)를 읽어서 JVM내의 Runtime Data Area(메모리)에 저장한다.
  • Execution Engine: Runtime Data Area(메모리)에 저장된 Byte code를 하나의 명령어 단위로 읽어들여 실행한다.
  • GC(Garbage Collector): 사용하지 않는 객체들을 메모리에서 해제한다.


JVM 메모리 영역 (= Runtime Data Area)

JVM의 메모리 영역은 크게 Method Area, Stack Area, PC Register, Native Method Stack Area 그리고 Heap Area로 나누어진다.

Method Area

인스턴스 생성을 위한 필요 정보(필드, Static 변수, 생성자와 메소드 등)을 저장하는 공간이다.

Runtime Constant Pool

각 데이터는 Runtime Constant Pool을 가지는데, 이는 각 데이터의 reference를 가지고 있어서 실제 물리적 메모리 위치를 참조할 때 사용한다.

Heap Area

JVM이 관리하는 프로그램에서 데이터를 저장하기 위해 Runtime시 동적으로 할당하여 사용하는 영역이다. Method Area에서 참조한 값을 바탕으로 새로운 객체를 생성(New 연산자로 생성)할 때 이곳에 저장된다. 이곳에 생성된 객체와 배열은 Stack Area의 변수나 다른 객체의 필드에서 참조한다. 만약 참조하는 변수나 필드가 없다면 GC의 대상이 된다.

Stack Area

프로그램 실행 중에 메소드들이 호출되면 Stack Area에 각 메소드를 위한 메모리가 할당된다. 즉, 각 메소드는 하나씩의 Stack을 가지게 된다. Stack Area는 이 메소드 내에서 사용되는 값을 저장하며 호출된 메소드의 지역변수, 매개변수, 리턴 값 및 연산 값을 임시로 저장한다. 따라서 사용이 끝나면 Stack 영역에서 해제된다.

PC Register

현재 실행 중인 JVM 명령 주소를 가진다. 현재 실행되고 있는 명령이 종료되면 카운트 값을 증가시켜 다음 명령을 실행한다.
(참고) 프로그램 실행은 CPU에서 Instruction을 수행한다. CPU는 Instruction을 수행하는 동안 필요한 정보를 CPU 내의 기억장치인 레지스터에 저장한다.

Native Method Stack Area

자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다. 즉, JNI(Java Native Interface)를 통해 호툴되는 C, Python 등의 코드를 수행하기 위한 Stack이다. 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.

댓글