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 |