⚡ Java - JVM 메모리 구조와 GC의 동작 원리
⚡ Java - JVM 메모리 구조와 GC의 동작 원리
🔹 JVM 메모리 구조
JVM은Java애플리케이션 실행을 위해 여러 메모리 영역을 나눠 관리한다.
▫️ 메서드 영역(Method Area)
- 클래스의 구조 정보,
static변수, 상수 풀 등이 저장 - 모든 스레드가 공유
JDK 8이후로는Metaspace로 대체
▫️ 힙 영역(Heap)
- 객체가 생성되는 공간
GC의 주요 대상Young영역과Old영역으로 나뉨
▫️ 스택 영역(JVM Stack)
- 메서드 호출 시 생성되는 프레임 저장
- 지역 변수, 매개변수, 리턴 값 등 저장
- 각 스레드마다 독립적으로 존재
▫️ PC 레지스터, 네이티브 메서드 스택
- 각각의 스레드가 실행 중인 명령어 주소 저장
C/C++로 작성된native코드 실행에 사용
🔹 힙 영역의 세분화
▫️ Young Generation
- 새로 생성된 객체가 저장되는 공간
Eden영역 + 두 개의Survivor영역(S0,S1)으로 구성- 대부분의 객체는 이 영역에서 생성되고 소멸됨
▫️ Old Generation
Young영역에서 살아남은 객체가 이동- 비교적 수명이 긴 객체가 존재
GC발생 빈도는 낮지만, 한번 발생하면 비용이 큼
🔹 GC의 기본 원리
GC(Garbage Collection)는 더 이상 사용되지 않는 객체를 탐지하고 제거하여 메모리를 회수하는 기능이다.
▫️ 참조 체계
- 객체가 다른 객체에 의해 참조되지 않을 때
GC대상이 됨 JVM은 참조 그래프 기반으로 객체 생존 여부를 판단
🔹 GC 알고리즘 종류
▫️ Mark and Sweep
- 사용 중인 객체를 표시(
mark) - 미사용 객체를 제거(
sweep) - 단점: 메모리 단편화 발생 가능
▫️ Copying
- 살아있는 객체를 새로운 공간으로 복사
- 복사 후 전체 메모리 정리
Young영역에서 자주 사용(Minor GC)
▫️ Mark-Compact
Mark and Sweep이후, 살아있는 객체를 한쪽으로 몰아서 압축- 단편화 문제 해결
Old영역에서 사용(Major GC)
▫️ Generational GC
- 객체의 생존 기간에 따라
Young과Old로 나누어 관리 - 대부분의 객체는 생성 후 금방 사라진다는 가정에 기반
🔹 GC의 종류(JVM 구현 기준)
▫️ Serial GC
- 단일 스레드로
GC수행 - 단순 구조, 작은 애플리케이션에 적합
▫️ Parallel GC
- 여러 스레드로
Young영역GC수행 Throughput위주
▫️ CMS(Concurrent Mark-Sweep)
GC작업을 애플리케이션 실행과 병행 수행Stop-The-World시간이 짧음- 단점: 메모리 단편화 가능
▫️ G1 GC (Garbage First)
Young,Old를 구분하지 않고Region단위로 메모리 관리- 예측 가능한
GC시간 제공 JDK 9부터 기본GC
🔹 Minor GC vs Major GC
| 구분 | Minor GC | Major GC(Full GC) |
|---|---|---|
| 대상 | Young 영역 | Old 영역 전체 |
| 속도 | 빠름 | 느림 |
| 발생 빈도 | 자주 | 드묾 (하지만 비용 큼) |
Stop-the-World | 발생함 | 발생함 |
🔹 GC 튜닝 시 고려 사항
- 애플리케이션의 메모리 사용 패턴 파악이 중요
Throughput우선인지, 응답 시간 우선인지에 따라GC선택 달라짐GC로그 분석,-Xmx,-Xms,-XX:+UseG1GC등의 옵션 사용
🔹 정리
JVM의GC는 객체의 생애주기를 관리하여 메모리 누수를 방지하고, 안정적인 메모리 사용을 보장한다.GC알고리즘의 원리와JVM내부 구조를 함께 이해하면, 성능 튜닝이나 장애 분석에 효과적으로 대응할 수 있다.
This post is licensed under CC BY 4.0 by the author.