728x90
반응형
JVM에서 자동으로 메모리를 관리하여 더이상 사용되지 않는 객체를 제거하고 메모리를 회수하는 매커니즘
개발자가 명시적으로 메모리를 해제하지 않아도되므로 메모리 누수를 방지하고 안정성을 높임
동작 원리
- Stop-The-World
- GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
- GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춤
- 어떤 GC 알고리즘을 사용하더라도 발생하기 때문에 성능 향상을 위래 고려해야할 건 Stop-The-World를 발생시키지 않도록 하는게 아니라 시간을 최소화 시키는 것임
- Mark and Sweep
- Mark
- 객체 그래프를 순회하여 참조되는 객체를 식별하고 표시
- 참조되지 않는 객체는 가비지로 간주
- Sweep
- Mark 단계에서 참조되는 않은 객체를 제거하고 해당 메모리를 회수
- Mark
- JVM 메모리 구조와 GC 연관성
- GC는 주로 Heap 메모리를 관리
- Young Generation
- Eden 영역: 새롭게 생성된 객체가 먼저 저장
- Survivor 영역: GC에서 살아남은 객체가 이곳으로 이동
- 대부분의 객체는 짧은 생명 주기를 가지므로 Young Generation에서 빠르게 회수됨 (Minor GC)
- Old Generation (Tenured)
- Young Generation에서 오랫동안 살아남은 객체가 이동
- 크기가 큰 객체나 장기적으로 사용되는 객체가 저장
- Old Generation의 GC는 Major GC(Full GC)로 실행되며 수행시간이 길어 애플리케이션 성능에 영향을 줄 수 있음
- Permanent Generation (PermGen)/ Metaspace
- 클래스 메타데이터 및 정적 변수 저장
- Java8 이후 PermGen이 Metaspace로 대체되었으며 Metaspace는 JVM 외부의 네이티브 메모리를 사용
- GC 튜닝
- JVM 옵션 설정
- XX:+UseG1GC: G1GC 활성화
- Xms 와 Xmx: 힙 메모리 크기 설정
- XX:MaxGCPauseMillis: 최대 GC 지연 시간 설정
- GC 로그 분석
- XX:+PrintGCDetails 또는 Xlog:gc 옵션을 사용해 GC 로그를 확인하고 성능 병목 분석
- 메모리 사용 패턴 이해: 애플리케이션에서 객체 생성 및 소멸 패턴을 분석하여 적합한 GC 알고리즘 선택
- JVM 옵션 설정
- 대상
- 더이상 참조되지 않는 객체
- 약한 참조로만 참조되는 객체
- null로 설정된 객체
종류
- Serial GC
- 단일 스레드로 GC 수행
- 간단하고 효율적 (작은 메모리 공간에서 적합)
- 멀티코어 환경에서는 비효율 적
- 사용 사례: 단일 스레드 애플리케이션
- Parallel GC (8버전 default GC)
- 멀티스레드를 사용해 GC 수행
- GC 속도가 빠름
- GC 작업 중 애플리케이션이 멈춤 (Stop-The-World 시간이 길 수 있음)
- 사용 사례: 대량 트랜잭션 처리 시스템
- CMS GC(Concurrent Mark-Sweep GC)
- Stop-The-World 시간을 최소화하려고 GC 작업을 애플리케이션 실행과 병렬로 수행
- 애플리케이션 지연시간 감소
- CPU 리소스 소모가 많고 Old Generation 조각화 발생 가능
- 사용 사례: 지연 시간이 중요한 실시간 서비스
- G1 GC(Garbage First GC) (11버전 default GC)
- Heap을 여러 영역으로 나누어 중요한 영역부터 우선적으로 GC 수행
- Stop-The-World 시간을 제어 가능. 조각화 최소화
- 설정과 튜닝이 필요
- 사용 사례: 대규모 애플리케이션
- ZGC
- 매우 짧은 Stop-The-World 시간
- 초대형 힙에서 성능 최적화
- 상대적으로 새로운 기술로 JVM 버전 의존성이 있음
- 사용 사례: 초대형 메모리 어플리케이션
728x90
반응형
'Java & Kotlin' 카테고리의 다른 글
Java 에서의 동시성 관리 방법 (1) | 2025.01.27 |
---|---|
JVM (0) | 2025.01.26 |
Java & Kotlin 장단점 (0) | 2025.01.25 |
PriorityQueue (우선순위 큐) (0) | 2023.07.07 |
Kotlin? (0) | 2022.08.28 |