티스토리 뷰
목차
1. JVM이란?
: JVM(Java Virtual Machine)은 자바 애플리케이션을 실행시키는 가상 머신(Virtual Machine)이다.
자바 소스코드(.java) -> 컴파일 -> 바이트코드(.class) -> jvm이 실행
- JVM은 운영체제 위에서 작동하며 플랫폼 독립성을 제공한다.
- "Write Once, Run Anywhere"가 가능한 이유
2. JVM의 구성 요소
- Class Loader (클래스 로더 시스템)
- .class 파일을 JVM 메모리로 로드하고, 링크 및 초기화 진행
- Bootstrap -> Extension -> Application 로더 계층 구조
- Runtime Data Area
- JVM 내부에서 실행되는 데이터 저장 공간
- 아래에서 자세히 다룸(Heap, Stack 등)
- Execution Engine (실행 엔진)
- 로딩된 바이트코드를 실제 명령어로 해석 및 실행
- 인터프리터 + JIT(Just-In-Time) 컴파일러 사용
- Native Interface
- JVM과 OS 또는 C/C++ 등 네이티브 라이브러리와 연결하는 역할
- Native Method Libraries
- JNI를 통해 사용하는 네이티브 함수 라이브러리
3. JVM 메모리 구조 (Runtime Data Area)
- Heap (힙 영역)
- 객체 인스턴스가 저장되는 공간
- GC(Garbage Collection)의 대상
- Young -> Old로 객체가 이동 (Generational GC)
- Stack (스택 영역)
- 메서드 호출 시 생성되는 프레임 저장
- 각 프레임은 지역 변수, 반환 주소, 중간 연산 결과 포함
- 스레드마다 Stack 영역이 별도로 존재
- Method Area (or MetaSpace)
- 클래스 메타데이터(클래스 정보, static 변수 등) 저장
- Java 8부터는 Permgen -> MetaSpace로 변경 (메모리 제한 없음)
- PC Register
- 각 스레드가 어떤 명령어를 실행 중인지 기록
- Native Method Stack
- C/C++로 작성된 네이티브 코드 실행 시 사용
4. GC(Garbage Collection)의 기본 동작
📌 왜 GC가 중요한가?
- Java는 개발자가 메모리 해제를 직접 하지 않음
- 대신 JVM이 사용하지 않는 객체를 탐지 후 자동 해제
🔄 동작 방식 (기본 개념)
- Mark -> Sweep -> Compact 단계로 처리
- 객체가 살아있는지 여부(mark) -> 제거(sweep) -> 메모리 재정렬(compact)
5. GC 대상의 영역-Young, Old, Survivor
| 영역 | 특징 |
| Young Generation | 새로 생성된 객체기 위치, GC 자주 발생 |
| Eden | 대부분의 객체는 여기에 생성됨 |
| Survivor S0/S1 | 살아남은 객체가 일시적으로 위치 |
| Old Generation | 생명 주기가 긴 객체가 이동됨(Full GC 대상) |
6. 실무에서 알아야 할 GC 종류
| GC 종류 | 설명 |
| Serial GC | 단일 스레드, 작은 메모리 환경에 적합 |
| Parallel GC | 멀티스레드, Throughput 최적화 |
| CMS (Concurrent Mark Sweep) | 응답 속도 위주, stop-the-world 시간 최소화 |
| G1 GC | Java 9 이후 기본, 지역화된 Heap 관리로 pause time 최소화 |
8. 실무에서 발생하는 주요 문제
| 문제 | 원인 |
| 메모리 누수(OutOfMemoryError) | 객체 참조가 끊기지 않음 |
| StackOverflowError | 재귀 호출 또는 무한 루프 |
| Full GC 반복 발생 | Old 명령이 꽉 찼고 객체가 계쏙 살이있음 |
| GC 튜닝 실패 | 애플리케이션 특성과 GC 특성 미스매치 |
✅ 마무리 요약
- JVM은 자바 프로그램 실행을 담당하는 핵심 구성 요소이며, Class Loader, Runtime Data Area, Execution Engine으로 구성된다.
- JVM의 메모리 구조를 이해하면 GC 튜닝, 성능 최적화, 디버깅이 쉬워진다.
🔜 다음 포스팅에서는 Java의 메모리 영역과 GC (Young/Old, G1, CMS 차이)에 대해 다뤄보고자 한다.
- JVM에서 객체는 어떻게 이동하는가?
- GC 튜닝 시 어떤 포인트를 보는가?
'IT > Java' 카테고리의 다른 글
| Java의 메모리 구조와 GC 완전 정복 (0) | 2025.04.14 |
|---|---|
| 어떤 버전의 JDK를 사용해야 할까? (3) | 2024.03.23 |