Java

[Java]JVM Data Area

RailCoder 2025. 5. 21. 23:29
반응형

JVM Data Area

1. Method Area (메서드 영역)

설명:

  • 클래스 수준의 정보가 저장되는 공간이다.
  • 클래스 로딩 시점에 JVM에 의해 로드되고, 클래스가 언로드될 때까지 유지된다.

저장되는 데이터:

  • 클래스 이름, 부모 클래스 이름, 메서드 정보, 필드 정보
  • static 변수
  • constant pool (상수 풀)

사용 시점:

  • 클래스가 처음 로드될 때 해당 정보들이 이 영역에 저장된다.

설정 방법:

  • 이 영역은 PermGen (Java 7 이하) 또는 Metaspace (Java 8 이상)로 구성된다.
  • 설정 예:
    • Java 7 이하: XX:PermSize, XX:MaxPermSize
    • Java 8 이상: XX:MetaspaceSize, XX:MaxMetaspaceSize

 

2. Heap Area (힙 영역)

설명:

  • 자바에서 생성된 객체가 저장되는 영역이다.
  • GC(Garbage Collector)의 대상이 되는 주요 영역이다.

저장되는 데이터:

  • 인스턴스 변수
  • 배열
  • 객체 데이터

사용 시점:

  • new 키워드를 통해 객체가 생성될 때마다 힙에 저장된다.

설정 방법:

  • Xms (초기 힙 크기), Xmx (최대 힙 크기) 옵션으로 조절 가능
  • bash 복사편집 java -Xms256m -Xmx1024m MyApp

 

3. Stack Area (스택 영역)

설명:

  • 각 스레드마다 생성되며, 메서드 호출 시 프레임(Stack Frame)을 저장하는 공간이다.

저장되는 데이터:

  • 지역 변수
  • 매개 변수
  • 연산 중간 결과
  • 리턴 값
  • 메서드 호출 시의 정보 (프레임)

사용 시점:

  • 메서드가 호출될 때마다 새로운 스택 프레임이 생성되고, 메서드가 종료되면 제거된다.

설정 방법:

  • Xss 옵션으로 각 스레드의 스택 크기를 설정 가능
  • bash 복사편집 java -Xss512k MyApp

 

4. Program Counter (PC) Register

설명:

  • 각 스레드마다 존재하며, 현재 실행 중인 JVM 명령어의 주소를 저장한다.

저장되는 데이터:

  • 현재 실행 중인 명령어의 주소 (bytecode 위치)

사용 시점:

  • JVM 명령어가 실행될 때, 다음에 실행할 명령어의 위치를 추적한다.

설정 방법:

  • JVM이 내부적으로 관리하며, 별도의 설정은 제공하지 않는다.

 

5. Native Method Stack (네이티브 메서드 스택)

설명:

  • 자바가 아닌 네이티브 코드(C, C++)를 호출할 때 사용되는 스택이다.
  • 예: System.gc() 같은 메서드는 내부적으로 네이티브 메서드를 호출한다.

저장되는 데이터:

  • 네이티브 메서드 호출에 필요한 정보와 지역 변수

사용 시점:

  • native 키워드가 선언된 메서드가 호출될 때

설정 방법:

  • 일반적으로 설정하지 않지만, JVM 구현체에 따라 스택 크기를 조절할 수 있다.

 

요약

영역 저장되는 데이터 생성 시점 주요 설정

Method Area 클래스 정보, static, 상수 풀 클래스 로딩 시 -XX:MetaspaceSize, -XX:MaxMetaspaceSize
Heap 객체, 배열 객체 생성 시 -Xms, -Xmx
Stack 지역 변수, 프레임 메서드 호출 시 -Xss
PC Register 명령어 위치 스레드 시작 시 (설정 불가)
Native Method Stack 네이티브 호출 정보 native 메서드 호출 시 JVM 의존적

필요한 경우 GC 튜닝이나 OutOfMemoryError 대응을 위해 이 영역들의 크기를 조정하게 된다. 각 영역은 JVM이 스레드 및 애플리케이션 실행 상태를 관리하기 위한 필수 구성 요소이므로, 시스템 성능 및 안정성에 영향을 줄 수 있다.

 

 

반응형