CS 정리

GC, Garbage Collection

문쿼리 2025. 4. 12. 18:20

GC, Garbage Collection

JVM 내부에서 백그라운드 thread로 동작하는 task. heap 영역의 메모리를 자동으로 관리해준다. (python, C++도 있다)

ItemVO itemVo = new ItemVO();
itemVo = null;	// 더 이상 참조되지 않은 메모리는 GC 대상

 

동작원리

  • Reachability  -> Mark -> Sweep -> Compact
  • Reachability 분석
    : GC ROOT 로부터 도달할 수 없는 개체를 가비지로 판단함
    GC ROOT(static 변수, Thread 참조, 지역변수)
  • Mark : GC Root에서부터 살아있는 객체를 표시
  • Sweep : 표시되지 않은 객체(죽은 객체)를 제거
  • Compact : 살아있는 객체를 한쪽으로 모아 메모리 단편화 제거

* GC와 메모리

JVM 메모리 구조와 연계, Heap은 세대로 분류 (Generational)

  • Young : 새 객체가 생기는 곳
  • Old : 오래된 객체가 있는 곳, 오래 사용되는 객체가 Old로 승급
  • Metaspace : 클래스 메타데이터
메모리 위치 동작 GC
Young Gen Heap 자주, idle Minor GC /Full GC
Old Gen Heap 가끔, 메모리 풀 Major /Full GC
Metaspace java 8 이전 = Heap
java 8 부터 = native
조건부, 클래스가 언로드 Full GC 포함 시 일부

 

* GC 종류

항목 Minor GC Major GC Full GC
대상 영역 Young Gen Old Gen Young + Old + Metaspace
발생 빈도 자주 드물게 매우 드물게 (하지만 치명적)
발생 시점 새 객체 할당 공간이 없을 때,
Eden이 꽉차면,
Survivor 영역에 남은 객체가 있을때.
새 객체 할당 공간이 없을 때,
Young 에서 Old으로의 승격 실패할 때,
System.gc() 코드 실행할 때
Young, Old, meta 모두 부족할 때
OutofMemory 발생 위기 시,
jcmd, jmap 등 CLI 명령어 발생
속도 빠름(부담없음) 느림 가장 느림(심각함)
목적 짧은 생명 객체 정리 오래된 객체 정리 전체 상태 리셋 수준

 

특징

  • 자동 메모리 해제
  • 메모리 누수 방지
  • 객체 생명주기 기반 관리 : 참조되지 않는 객체만 제거
  • 멀티스레드 환경 안전 : 스레드 동기화
  • Stop-the-World 발생 : GC 동작 중 app이 일시정지하는 상태

종류

GC 종류 사용 가능 Java 버전 주요 목적 특징 비고
Serial GC
-XX:+UseSerialGC
Java 1.2+ 일반 / 데스크탑 / 단일 스레드 단일 스레드, 가장 단순함 클라이언트 환경에 적합
Parallel GC
-XX:+UseParallelGC
Java 1.4+ (Java 8 기본) 병렬 처리 / Throughput 우선 멀티스레드, 빠름, 압축 포함 Java 8에서 기본 GC
CMS (Concurrent Mark Sweep)
-XX:+UseConcMarkSweepGC
Java 1.4~Java 14 저지연 / 병행 수거 Mark-Sweep 병행 처리, 압축 없음 Java 9부터 deprecated
G1 GC
-XX:+UseG1GC
Java 7+ (Java 9부터 기본) 일반 + 예측 가능한 짧은 정지시간 Region 단위 관리, 병렬/병행 GC Java 9~현재 대부분의 기본값
ZGC
-XX:+UseZGC
Java 11+ 초저지연 / 대용량 Heap 대부분 병행, STW ≒ 1~2ms Java 17부터 정식 안정화
Shenandoah
-XX:+UseShenandoahGC
Java 12+ 초저지연 / CMS 대체 병행 마크 + 병행 압축 RedHat 주도 Java 17부터 정식
Generational ZGC Java 21+ (experimental) 초저지연 + 세대 분리 ZGC의 세대별 최적화 버전 실험적 단계 (미래 기대)

* 저지연 : STW를 줄이는 것

* 병행수거 : app실행 중 GC일부를 실행

* Region 단위 관리 : Heap을 조각(Region)으로 나눠서 관리(나눠서 정리)

* Compaction : 메모리를 한쪽으로 정리하는 압축

* Throughput : 전체 시간 중 GC가 아닌 실제 작업 시간 비율

* Generational GC : 객체 수명에 따라 나눠서 관리하는 GC

'CS 정리' 카테고리의 다른 글

STW, Stop the world 제어하기  (2) 2025.04.13
메세지 큐, Message Queue  (0) 2025.04.13
메모리 단편화, Fragmentation  (0) 2025.04.12
JVM, Java virtual machine  (0) 2025.04.11
java Collection, Hash 연관 정리  (0) 2025.04.07