Runtime Data Area
JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역. Run-Time Data Area 에는 크게 아래 5가지의 영역이 존재합니다.
Method Area
- 인스턴스 생성을 위한 객체 구조, 생성자, 필드 등이 저장됩니다.
- Runtime Constant Pool 과 static 변수, 그리고 메소드 데이터와 같은 Class 데이터들도 이곳에서 관리가 됩니다.
- 이 영역은 JVM 당 하나씩만 생성이 됩니다.
- 인스턴스 생성에 필요한 정보도 존재하기 때문에 JVM의 모든 Thread들이 Method Area을 공유하게 됩니다.
- JVM의 다른 메모리 영역에서 해당 정보에 대한 요청이 오면, 실제 물리 메모리 주소로 변환해서 전달해줍니다.
- JVM 구동 시작 시 생성이 되며, 종료 시까지 유지되는 공통 영역입니다.
Heap
- 코드 실행을 위한 Java 로 구성된 객체 및 JRE 클래스들이 탑재됩니다.
- 문자열에 대한 정보를 가진 String Pool 뿐만 아니라 실제 데이터를 가진 인스턴스, 배열 등이 저장됩니다.
- 이 영역은 JVM 당 하나씩만 생성이 됩니다.
- 해당 영역이 가진 데이터는 모든 Java Stack 영역에서 참조되어, Thread 간 공유가 됩니다.
- Heap 영역이 가득 차게 되면 OutOfMemoryError 를 발생시키게 됩니다.
- 참조되지 않는 인스턴스와 배열에 대한 정보가 발생할 수 있으며 GC의 주 대상이 됩니다.
Java의 GC(Garbage Collection)방법과 종류
- 각 Thread 별로 메모리를 할당받는 Java Stack 영역과 달리 조금은 속도가 느린 점이 있습니다.
- 모든 Thread 들이 해당 영역인 Heap 을 공유하여 Java 의 동시성 문제가 발생하게 됩니다. 각각의 Thread 메모리가 따로 관리되는 것과 달리 이 부분은 Thread 에 의해서 공유가 되기 때문에 Thread Safe 하지 않습니다.
Java의 동시성 이슈 - 내용 추가 필요.
Java Stacks
- 각 Thread 별로 따로 할당되는 영역입니다.
- Heap 메모리 영역보다 비교적 빠르다는 장점이 있습니다.
- 각각의 Thread 별로 메모리를 따로 할당하기 때문에 동시성 문제에서 자유롭다는 점도 있습니다.
- 각 Thread 들은 메소드를 호출할 때마다 Frame 이라는 단위를 추가(push)하게 됩니다.
- 메소드가 마무리되며 결과를 반환하면 해당 Frame 은 Stack 으로부터 제거(pop)가 됩니다.
- Frame 은 메소드에 대한 정보를 가지고 있는 Local Variable, Operand Stack 그리고 Constant Pool Reference로 구성이 되어 있습니다.
- Local Variable은 메소드 안의 지역 변수들을 가지고 있습니다.
- Operand Stack은 메소드 내 연산을 위해서, 바이트 코드 명령문들이 들어있는 공간입니다.
- Constant Pool Reference는 Constant Pool 참조를 위한 공간입니다.
- 이렇게 구성된 Java Stack은 메소드가 호출될 때마다 Frame이 쌓이게 됩니다.
- Java Stack 영역이 가득 차게 되면 StackOverflowError 를 발생시키게 됩니다.
- JVM 의 전체적인 메모리가 부족하면 OutOfMemoryError 가 발생하기도 합니다.
Frame 스택 구조 및 Heap 영역 참조 예시
class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
int id = 1;
String name = "whybe";
Person person = null;
person = buildPerson(id, name);
}
private static Person buildPerson(int id, String name) {
return new Person(id, name);
}
}
Native Method Stacks
- Java로 작성된 프로그램을 실행하면서, 순수하게 Java로 구성된 코드만을 사용할 수 없는 시스템의 자원이나 API가 존재합니다. 이런 다른 프로그래밍 언어로 작성된 메소드들을 Native Method라고 하는데, Native Method Stacks는 이런 Java로 작성되지 않은 메소드를 다루는 영역입니다.
- C Stacks라고도 불리며 Java Stacks 영역과 비슷하게 메서드가 쌓이는 방식으로 동작합니다.
PC(Program Counter) Registers
- Java에서 Thread는 각자의 메소드를 실행하게 됩니다. 이때 Thread 별로 동시에 실행하는 환경이 보장되어야 하므로 최근에 실행 한 명령어 주소값을 저장할 공간이 필요합니다. 이 부분을 PC Registers 영역이 관리하여 추적해주게 됩니다.
- Thread들은 각각 자만의 PC Registers를 가지고 있습니다.
- 실행했던 메소드가 네이티브하다면 undefined가 기록되며, 네이티브 하지 않다면, PC Registers는 JVM에서 사용된 명령의 주소값을 저장하게 됩니다.
출처
참조
JVM의 구조