자바 애플리케이션의 실행 환경인 JVM(Java Virtual Machine)의 구조와,
JVM 내부에서 메모리가 어떻게 구성되고 관리되는지를 중심으로 정리하였다.
특히 힙(Heap)과 스택(Stack)의 차이와 역할, 그리고 개발자가 주의해야 할 메모리 관리 포인트를 함께 다루었다.
1. JVM이란?
JVM은 자바 바이트코드(.class)를 실행하는 가상의 머신으로,
플랫폼에 독립적인 자바 실행 환경을 제공한다.
JVM은 다음과 같은 주요 구성 요소로 이루어져 있다:
| 구성 요소 | 설명 |
|---|---|
| Class Loader | 클래스(.class) 파일을 메모리로 로딩 |
| Execution Engine | 바이트코드를 해석 또는 JIT 컴파일 후 실행 |
| Garbage Collector | 불필요한 객체를 탐지하고 메모리 회수 |
| Runtime Data Area | 메모리 구조(Heap, Stack 등)를 담당 |
2. JVM 메모리 구조
JVM의 메모리 영역은 크게 아래와 같이 나뉜다:
| 영역 | 설명 |
|---|---|
| Method Area | 클래스 정보, static 변수, 메서드 코드 저장 |
| Heap | 객체(instance) 저장, GC의 대상 |
| Stack | 스레드별 프레임(stack frame) 저장 (메서드 호출, 지역 변수 등) |
| PC Register | 현재 실행 중인 명령어 주소 저장 |
| Native Method Stack | C 등 네이티브 코드 실행용 스택 |
3. 힙(Heap) 영역
- 모든 new 키워드로 생성된 객체는 Heap에 저장된다.
- GC(Garbage Collector)의 관리 대상이 된다.
- 영역은 다음과 같이 분리되어 있다:
Young Generation (Eden + Survivor)
→ 객체가 처음 생성되는 영역, Minor GC 발생
Old Generation
→ 오래 살아남은 객체가 이동, Major GC 발생
객체의 생애 주기를 따라 점점 Old 영역으로 이동하는 구조를 Generational GC라고 한다.
4. 스택(Stack) 영역
- 스레드마다 독립적인 Stack 공간을 가진다.
- 하나의 메서드가 호출될 때마다 Stack Frame이 생성되며, 메서드 종료 시 제거된다.
- 프레임에는 지역 변수, 매개변수, 반환 주소 등이 포함된다.
특징
- LIFO(Last In First Out) 구조
- 스레드 간 공유되지 않기 때문에 동기화 이슈가 없다
- 크기가 제한되어 있으며, 재귀 등으로 과도하게 사용 시
StackOverflowError발생
5. 개발자가 주의할 메모리 포인트
- 객체를 과도하게 생성하거나, GC가 회수하지 못하도록 참조를 유지하면 메모리 누수 발생 가능
- static 변수는 Method Area에 상주하며 애플리케이션 종료 전까지 유지된다
- Stack은 빠르지만 용량 제한이 있으므로 재귀 깊이에 주의가 필요하다
- JVM 튜닝 시
-Xmx,-Xms,-Xss옵션 등을 통해 영역별 크기 조정 가능
학습 정리
JVM은 자바 애플리케이션의 실행을 담당하는 핵심 컴포넌트로,
힙과 스택은 각각 객체와 실행 흐름을 담당하는 중요한 메모리 구조이다.
이 구조를 이해하면 성능 문제 분석, 메모리 튜닝, 오류 디버깅 등에 있어 큰 도움이 된다.
'CS공부 > Java & Spring' 카테고리의 다른 글
| Spring 내부 구조 - DispatcherServlet, 요청 흐름, 에러 처리 (0) | 2025.04.22 |
|---|---|
| Spring Boot @Transactional 어노테이션 (0) | 2025.04.22 |
| Spring Boot 프로젝트 horong 리팩토링 (1) | 2025.04.22 |
| 힙 메모리 누수 (0) | 2025.04.22 |
| 가비지 컬렉션(Garbage Collection) (0) | 2025.04.21 |