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이 스레드 및 애플리케이션 실행 상태를 관리하기 위한 필수 구성 요소이므로, 시스템 성능 및 안정성에 영향을 줄 수 있다.
'Java' 카테고리의 다른 글
[JAVA]Trie를 이용한 접두사 검색 (Autocomplete 기능 구현) (0) | 2025.03.16 |
---|---|
Java 7 functions (0) | 2023.06.18 |
JDK, JRE, JVM이란? (0) | 2023.06.15 |
[ERROR]cannot find symbol (0) | 2023.05.29 |
[ERROR]Illegal modifier for the interface field Observer.name; only public, static & final are permitted (0) | 2023.05.29 |