20230211 [Java] 메모리 구조 (Runtime Data Area)

Daisy🌷·2023년 2월 11일
0

RunTime Data Area

  • Runtime Data Area는 JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역이다.
  • Runtime Data Area는 5가지로 구분된다.
  1. PC Register
  2. JVM stack
  3. Native Method stack
  4. Heap
  5. Method Area
  • 위 그림에서 확인할 수 있듯이 1 ~ 3 영역은 Thread별로 생성되고 4 ~ 5 영역은 모든 Thread가 공유한다.

1. PC Register (Thread별로 1개씩 존재)

스레드가 어떤 명령어로 실행되어야 할지 기록하는 부분이다. (JVM 명령의 주소를 가진다.)

  • Java의 PC Register는 CPU 내의 기억장치인 레지스터와는 다르게 작동한다. (Register-Base가 아닌 Stack-base로 작동)
  • 현재 수행 중인 JVM Instruction의 주소를 가진다.

2. JVM stack (Thread별로 1개씩 존재)

지역변수, 매개변수, 메소드 정보, 임시 데이터 등을 저장한다.

  • Thread의 Method가 호출될 때 수행 정보(메소드 호출 주소, 매개변수, 지역 변수, 연산 스택)가 Frame이라는 단위로 JVM stack에 저장된다. 그리고 Method 호출이 종료될 때 stack에서 제거된다.

3. Native Method stack(Thread별로 1개씩 존재)

실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.

  • Java 외의 언어로 작성된 네이티브 코드들을 위한 stack
    ex) JNI를 통해 호출되는 C/C++ 등의 코드

4. Heap (모든 Thread가 공유)

런타임에 동적으로 할당되는 데이터가 저장되는 영역이다. 객체나 배열 생성이 여기에 해당한다.

  • 인스턴스와 배열이 동적으로 생성되는 공간이다.
  • 그리고 Garbage Collection의 대상이 되는 영역이다.
  • 개발자는 객체를 제거하기 위해 별도의 코드를 작성할 필요가 없고 오히려 부작용만 낳을 가능성이 크다.
  • 모든 Thread가 공유하기 때문에 동기화 문제가 발생할 수 있다.

5. Method Area(모든 Thread가 공유)

JVM이 시작될 때 생성되고, JVM이 읽은 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드 및 메서드 코드, 정적 변수, 메서드의 바이트 코드 등을 보관한다.

  • Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타데이터 정보가 저장된다.
  • 이 영역에 등록된 class만이 Heap에 생성될 수 있다.
  • 사실 Method Area는 논리적으로 Heap에 포함된다.
  • 더 구체적으로는 Heap의 PermGen이라는 영역에 속한 영역인데, Java 8 이후로는 Metaspace라는 OS가 관리하는 영역으로 옮겨지게 된다.
profile
티스토리로 블로그를 이전했습니다. 😂 구경 오세요! 👉🏻 https://u-ryu-logs.tistory.com

0개의 댓글