본문 바로가기
Java Study

java 런타임 데이터 에리어

by xogns93 2024. 7. 15.

java 런타임 데이터 에리어

Java에서 런타임 데이터 에리어는 프로그램 실행 중 JVM이 사용하는 메모리 영역들을 의미합니다. 주요 구성 요소는 다음과 같습니다.

 

 

메소드 에리어(Method Area)클래스 수준의 데이터(메타데이터)가 저장되는 영역입니다. 이 영역에는 다음과 같은 것들이 포함됩니다.

  • 클래스(또는 인터페이스) 메타데이터: 클래스와 인터페이스의 구조적 정보(예: 클래스 이름, 부모 클래스 이름, 인터페이스 목록 등).
  • 필드 정보: 클래스에 정의된 변수들(스태틱 변수 포함)의 정보.
  • 메서드 정보: 클래스에 정의된 메서드의 코드와 메서드의 바이트코드, 메서드에 대한 정보(이름, 리턴 타입, 매개변수 타입 등).
  • 스태틱 필드(변수): 클래스 수준에서 관리되는 변수로, 클래스 로딩 시점에 메모리에 로드되고 프로그램 종료 시까지 유지됩니다.
  • 런타임 상수 풀 (Runtime Constant Pool) : 상수 값(리터럴) 및 메서드, 필드 참조를 저장하는 메모리 영역으로, 클래스 파일 상수 풀의 런타임 표현입니다.

 

힙(Heap) = 오브젝트 에리어모든 객체와 배열이 저장되는 런타임 데이터 영역입니다. JVM은 가비지 컬렉션을 통해 힙을 관리합니다. ( Java 프로그램에서 생성된 모든 객체는 Heap 영역에 할당, 객체의 생성과 소멸은 자바 가비지 컬렉션(Garbage Collection)에 의해 관리 )

 

스택(Stack): 각 스레드마다 생성되며, 메서드 호출 시마다 프레임이 추가됩니다. 각 프레임에는 지역 변수, 피연산자 스택, 그리고 메서드 호출 및 반환에 대한 정보가 포함됩니다.

 

PC 레지스터(Program Counter Register): 현재 실행 중인 JVM 명령의 주소를 나타냅니다. 각 스레드는 자신의 PC 레지스터를 가지고 있습니다.

 

네이티브 메서드 스택(Native Method Stack): 자바가 아닌 네이티브 메서드(C, C++ 등) 호출을 위한 스택입니다. 각 스레드는 네이티브 메서드 스택을 가지고 있습니다.

 

 

String Constant Pool

  • 위치: String Constant Pool은 JVM의 힙 메모리 내에 존재합니다. 자바 7 이전에는 메서드 영역(PermGen)에 있었지만, 자바 7 이후부터는 힙 메모리의 일부로 변경되었습니다.
  • 역할: 동일한 문자열 리터럴을 공유하고 중복 저장을 방지하여 메모리 사용을 효율화합니다.
  • 동작 방식:
    • 새로운 문자열 리터럴이 생성될 때, JVM은 먼저 String Constant Pool에서 해당 문자열이 이미 존재하는지 확인합니다.
    • 존재하면, 기존 문자열에 대한 참조를 반환합니다.
    • 존재하지 않으면, 새로운 문자열을 String Constant Pool에 추가하고 그에 대한 참조를 반환합니다.

 

메서드 에리어의 중요 구성 요소

  1. 클래스 로더: JVM 내에서 클래스를 로드하는 데 사용되는 클래스 로더 메타데이터.
  2. 클래스 데이터: 클래스 변수, 메서드 데이터, 인터페이스 등 클래스 구조에 관한 데이터.
  3. 런타임 상수 풀(Runtime Constant Pool): 상수 및 메서드, 필드 참조를 포함하는 메모리 영역으로 클래스 파일의 상수 풀(Constant Pool)의 런타임 표현입니다.

 

메서드 에리어에서 주목할 점

  • 스태틱 필드: 클래스 로딩 시 메모리에 로드되어 모든 인스턴스가 공유하는 변수입니다. 이는 메서드 에리어에 저장됩니다.
  • 메서드 바이트코드: JVM이 실행할 수 있는 바이트코드로 변환된 메서드의 구현입니다.
  • 클래스 초기화 코드: 클래스 로딩 시 초기화되는 코드도 이 영역에 포함됩니다.