프로그래밍/면접대비문제
JVM의 Garbage Collection(GC)
Angloper
2024. 12. 26. 20:45
JVM의 Garbage Collection(GC)
- Garbage Collection(GC)은 JVM(Java Virtual Machine)에서 동정으로 생성된 객체의 메모리를 자동으로 관리하는 메커니즘. GC는 애플리케이션의 메모리 누수를 방지하고, 더 이상 사용되지 않는 객체를 제거해 메모리를 효율적으로 사용하도록한다.
기본개념
1. GC의 역할
- JVM이 힙 메모리(Heap Memory)에 생성된 객체 중 더 이상 사용되지 않는 객체를 식별하고 제거한다.
- 이를 통해 애플리케이션의 메모리 누수를 방지하고, 수동 메모리 관리의 필요성을 제거한다.
2. GC가 관리하는 영역
- Heap Memory
- Youg Generation (Eden, Survivor Space)
- Old Generation (Tenured)
- Metaspace
- 클래스 메타데이터를 저장하는 공간.
JVM Heap Memory 구조
1. Young Generation
- 새로 생성된 객체가 저장됨.
- 크기가 작고, 객체의 생존 시간이 짧은 경우가 대부분.
- 구성요소
- Eden Space: 새로운 객체가 처음 생성되는 공간.
- Survivor Space: Eden에서 살아남은 객체가 복사되는 공간.
2. Old Generation
- Young Generation에서 오래 살아남은 객체가 이동.
- 크기가 크거나 생존 시간이 긴 객체가 저장됨.
3. Metaspace
- 클레스 로더와 메타데이터 정보를 저장.
GC 동작 과정
1. Minor GC
- Young Generation에서 발생.
- 동작 원리
- Eden에서 객체가 생성.
- Eden이 가득차면 Minor GC가 실행
- Eden에서 살아남은 객체가 Survivor Space로 이동.
- 여러번의 Minor Gc를 통해 Survivor Space에서 생존한 객체가 Old Generation으로 이동.
- 특징
- 실행 속도가 빠르며, Young Generation 크기에 다라 성능이 좌우됨.
- Stop-The-World qkftod
2. Major GC(Full GC)
- Old Generation에서 발생
- 동작 원리
- Old Generation이 가득 차면 실행
- 사용되지 않는 객체를 제거하고 힙 메모리를 정리
- 특징
- 실행 시간이 길고 Stop-The-Wold가 발생
- Minor GC보다 성능에 더 큰 영향을 미침.
3. GC의 실행 과정(가비지 식별, 처리 과정)
- Mark: GC는 모든 객체를 순회하며 현재 참조되고 있는 객체를 식별하고
마크
함 - Sweep: 마크되지 않은, 즉 참조되지 않는 객체를 메모리에서 제거함.
- Compact(압축): 객체를 제거하고 남은 메모리 조각들을 모아 연속된 공간을 확보함. 힙메모리 단편화를 해소하는데 도움을 줌.
GC의 종류
JVM은 다양한 GC 알고리즘을 제공한다. 각각의 알고리즘은 GC성능과 애플리케이션 요구사항에 따라 다르다.
1. Serial GC
- 단일 스레드에서 작동
- 특징
- 작은 애플리케이션(싱글 스레드)에 적합.
- Full GC중 애플리케이션이 멈추는 "Stop-The-Wold"시간이 길다.
2. Parallel Gc(Throughput GC)
- 여러 스레드를 사용해 GC를 수행
- 특징
- 처리량(Throughput) 지향.
- 적절한 애플리케이션 성능과 낮은 GC비용을 제공.
3.G1 GC
- Java 9 이후의 기본 GC
- 특징
- 힙을 Region으로 나누어 관리.
- Yong/Old Generation을 따로 구분하지 않고 필요에 따라 Region을 재배치.
- 짧은 응답 시간과 적은 Stop-The-World 시간을 제공.
4. ZGC
- 매우 낮은 지연시간을 목표로 설계
- 특징
- 대규모 힙을 지원 (최대 16TB)
- 애플리케이션 중단 시간이 10ms 이내
5. Shenandoah GC
- 낮은 지연시간을 제공.
- 특징
- GC 작업과 애플리케이션 작업을 병렬로 수행.
- ZGC 보다 짧은 지연시간 제공.
GC 튜닝과 모니터링
1. JVM옵선을 통한 설정
- GC 종류 선택
-XX:+Use{GCNAME}
- ex: G1GC
-XX:+UseG1GC
- Heap 크기 설정
Xms
: 초기 힙 크기 (ex:Xms512m
)Xmx
: 최대 힙 크기 (ex:Xmx1024m
)
- GC로그 활성화
-Xlog:gc
2. 주요 GC메트릭 모니터링
- GC 횟수와 시간: 애플리케이션 성능에 얼마나 영향을 주는지 확인.
- 힙 사용량: Minor GC및 Major GC 후의 메모리 상태
- 툴 사용: VisualVM, JConsole, Prometheus && Grafana
3.최적화를 위한 설정
- 적절한 Heap크기 설정
- 너무 작은 힙 크기는 잦은 GC유발
- 너무 큰 힙 크기는 GC시간이 오래걸림
- 객체 생명 주기 관리
- 불필요한 객체 생성 줄이기
- 전역 변수 사용 최소화
- GC 로그를 통한 분석
- GC로그를 주기적으로 분석 하여 병목현상을 파악.
- 애플리케이션 패턴에 따라 GC알고리즘 선택
- 메모리 누수 감지
- 정적 코드 분석 툴을 사용하여 메모리 누수 방지.
반응형