Java Runtime Memory Structure

오형택·2023년 7월 29일
0
post-thumbnail

Runtime Data Area

Java 프로그램을 실행할 때, JVM은 OS로부터 메모리 영역을 할당받아 사용하는데 이 영역을 Java Runtime Data Area라고 부르며 아래와 같은 구조를 가진다.

JVM_Runtime_Data_Area
Runtime Data Area에는 thread 간에 공유되는 영역과 thread마다 독립적으로 할당받는 영역이 존재한다. thread는 프로세스 내에서의 실행 단위로, 일반적으로 작성된 Java 애플리케이션의 경우 Main thread가 main 메서드를 실행하면서 시작되어 실행 중 추가적인 thread를 생성하지 않았다면 single thread 방식으로 구동된다.

per-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 문제가 발생한다.

모든 thread가 공유하는 메모리

  • Heap
    Heap은 Class Object와 new 키워드를 통해 생성된 인스턴스가 저장되는 영역으로 각 인스턴스는 스택의 참조 변수를 통해 접근할 수 있다. 생성 후 참조되지 않는 인스턴스는 JVM에 의해 GC(Garbage Collector)의 대상이 되어 메모리에서 제거된다.
    Java에서 String 리터럴을 저장하는 String Constant Pool 또한 Java 7 이후로 Heap 영역에 저장되어 GC의 대상이 된다.
  • Method Area (Metaspace)
    Method Area는 주로 Class-Loader에 의해 로드되는 클래스의 메타데이터가 저장되는 영역으로 Java 7까지는 PermGen(Permanant Generation)이라는 이름으로 Java Heap 영역에 고정된 크기로 할당되어 할당된 메모리 크기를 넘어설 경우, OOM(Out-Of-Memory) 에러가 발생하는 문제가 있었지만, Java 8부터 Metaspace라는 Native Memory 영역으로 넘어오면서 메모리 부족시 동적으로 시스템 메모리를 할당받게 되면서 OOM 에러의 발생 가능성을 크게 낮추게 되었다. JVM_Metaspace
    Metaspace에 저장되는 데이터들은 구체적으로 다음과 같다.
  1. Meta info
    Class name, super class, super interface, class modifiers 등 클래스의 메타데이터.

  2. Method info
    Method name, return type, arguments, method modifiers, method byte code 등 메소드 관련 데이터.

  3. Method table
    Method table은 힙에 저장된 인스턴스에 대한 메서드 참조 정보를 저장하는 데이터 구조로 객체 지향의 중요 속성인 다형성을 지원한다.

  4. Field info
    Field name, type, modifiers 등 필드 관련 데이터.

  5. Runtime constant pool
    Class loader에 의해 클래스를 로드할 때, .class 파일 내의 constant pool이 저장되는 영역이다. class file constant pool에는 클래스 내 리터럴(문자열, 숫자 상수), 클래스 이름, 필드, 메서드에 대한 symbolic reference가 테이블 형태로 저장되어 있다.

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

profile
개발자 지망생

2개의 댓글

comment-user-thumbnail
2023년 7월 29일

잘 읽었습니다. 좋은 정보 감사드립니다.

1개의 답글