Java 프로그램을 실행할 때, JVM은 OS로부터 메모리 영역을 할당받아 사용하는데 이 영역을 Java Runtime Data Area라고 부르며 아래와 같은 구조를 가진다.
Runtime Data Area에는 thread 간에 공유되는 영역과 thread마다 독립적으로 할당받는 영역이 존재한다. thread는 프로세스 내에서의 실행 단위로, 일반적으로 작성된 Java 애플리케이션의 경우 Main thread가 main 메서드를 실행하면서 시작되어 실행 중 추가적인 thread를 생성하지 않았다면 single thread 방식으로 구동된다.
PC register
CPU에서 사용되는 pc register와 별도의 것으로, 현재 수행중에 있는 JVM instruction의 주소가 저장되는 영역이다. 만약 thread가 다른 언어로 작성된 native 메서드를 수행하고 있을 경우, 레지스터의 값은 undefined 상태가 되며 이는 Native Method Stack 영역에서 처리한다.
Native Method Stack (C stack)
Java가 아닌 다른 언어로 작성된 native 메서드를 실행할 때 사용되는 영역이다.
JVM Stack
Thread 내 프로그램 수행 중에 메서드를 호출할 때마다 해당 메서드 수행에 대한 frame이 생성되어 JVM stack에 저장되고, 해당 메서드가 종료될 때 frame은 stack에서 제거된다.
메서드(A) 내에서 다른 메서드(B)를 호출시 A를 위한 frame이 먼저 stack에 생성되고 B에 대한 frame이 생성된 후에, B 메서드가 종료된 후에야 A 메서드가 종료되므로 stack에서 frame이 제거되는 순서는 B-A로 선입후출의 방식을 따른다.
frame에는 메서드에 전달된 파라미터, 리턴 값, 메서드 내 로컬 변수, 피연산자 스택 등이 저장된다. 메서드 파라미터의 경우, 전달된 값의 복사본이 저장되는데, 이로 인해 pass by value 문제가 발생한다.
Meta info
Class name, super class, super interface, class modifiers 등 클래스의 메타데이터.
Method info
Method name, return type, arguments, method modifiers, method byte code 등 메소드 관련 데이터.
Method table
Method table은 힙에 저장된 인스턴스에 대한 메서드 참조 정보를 저장하는 데이터 구조로 객체 지향의 중요 속성인 다형성을 지원한다.
Field info
Field name, type, modifiers 등 필드 관련 데이터.
Runtime constant pool
Class loader에 의해 클래스를 로드할 때, .class 파일 내의 constant pool이 저장되는 영역이다. class file constant pool에는 클래스 내 리터럴(문자열, 숫자 상수), 클래스 이름, 필드, 메서드에 대한 symbolic reference가 테이블 형태로 저장되어 있다.
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html
https://wellbell.tistory.com/161
https://obv-cloud.com/41
https://mia-dahae.tistory.com/m/101
https://e-una.tistory.com/67
잘 읽었습니다. 좋은 정보 감사드립니다.