본문 바로가기
Java & Kotlin

Garbage Collection

by kiwi_wiki 2025. 1. 26.
728x90
반응형

JVM에서 자동으로 메모리를 관리하여 더이상 사용되지 않는 객체를 제거하고 메모리를 회수하는 매커니즘

개발자가 명시적으로 메모리를 해제하지 않아도되므로 메모리 누수를 방지하고 안정성을 높임

동작 원리

  • Stop-The-World
    • GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
    • GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춤
    • 어떤 GC 알고리즘을 사용하더라도 발생하기 때문에 성능 향상을 위래 고려해야할 건 Stop-The-World를 발생시키지 않도록 하는게 아니라 시간을 최소화 시키는 것임
  • Mark and Sweep
    • Mark
      • 객체 그래프를 순회하여 참조되는 객체를 식별하고 표시
      • 참조되지 않는 객체는 가비지로 간주
    • Sweep
      • 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 알고리즘 선택
  • 대상
    • 더이상 참조되지 않는 객체
    • 약한 참조로만 참조되는 객체
    • 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