
Java의 Garbage Collection(GC)은 프로그래밍 언어에서 메모리 관리를 자동화하는 기능으로, 개발자가 명시적으로 메모리를 해제하지 않아도 사용하지 않는 객체를 식별하고 제거하여 메모리 누수를 방지한다. 이것은 JVM(Java Virtual Machine)의 메모리 관리 시스템의 핵심 기능 중 하나이다.
즉, C처럼 free 같은 걸 할 필요 없다.
Serial GC:

Parallel GC:

CMS (Concurrent Mark-Sweep) GC:
Mark-Sweep 방식:
G1 (Garbage-First) GC:

ZGC (Z Garbage Collector):

Shenandoah GC:

-XX:+UseG1GC: G1 GC 활성화-Xms<size>: 초기 Heap 크기 설정-Xmx<size>: 최대 Heap 크기 설정-XX:MetaspaceSize=<size>: Metaspace 크기 설정 (JDK 8 이후)1. 초기 Heap 크기와 최대 Heap 크기 설정 Tip
초기 Heap 크기 (-Xms)
초기 크기와 최대 크기를 동일하게 설정한다면(즉, -Xms와 -Xmx를 동일하게 설정) JVM이 Heap 크기를 동적으로 조정하는 과정을 생략할 수 있어, 성능 오버헤드를 줄일 수 있다. (ex. -Xms1024m -Xmx1024m)
반면, 충분히 큰 크기로 설정할 경우 애플리케이션이 초기 로드 시 많은 객체를 생성하거나, 데이터 캐싱을 사용하는 경우에 GC 발생을 줄일 수 있다.
최대 Heap 크기
시스템 전체 RAM을 기준으로 가용 메모리의 50~75%로 설정할 경우 애플리케이션 외에도 OS와 다른 프로세스가 메모리를 사용할 수 있기 때문에 여유가 생긴다. (ex. 시스템 RAM이 16GB라면 -Xmx8g ~ -Xmx12g 정도가 적합)
애플리케이션이 메모리를 점진적으로 많이 사용하는 경우, 과도한 Heap 크기를 설정하면 메모리 누수가 감지되기 어려워질 수 있다. 최적화를 위해 메모리 프로파일링 도구(ex. VisualVM, JProfiler)를 사용하자.
2. GC와 연계한 설정
-Xms4g -Xmx9g -XX:+UseG1GC
-Xms4g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200
3. 애플리케이션 특성에 따른 설정
-Xms8g -Xmx16g-Xms512m -Xmx1g4. 모니터링 기반 설정
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
5. 실전 팁
| JDK 버전 | 기본 GC | 주요 변경 사항 | 신규/개선된 GC |
|---|---|---|---|
| JDK 7 | Parallel GC | - 기본 GC는 Parallel GC. - CMS GC 및 Serial GC 사용 가능. | - |
| JDK 8 | Parallel GC | - Metaspace 도입 (Permanent Generation 제거). - G1 GC 성능 개선. | G1 GC |
| JDK 9 | Parallel GC | - Unified Logging Framework으로 GC 로깅 개선. - G1 GC 성능 대폭 개선. - ZGC 도입 (실험적). | ZGC (실험적) |
| JDK 10 | Parallel GC | - Thread-Local Handshake 도입 (특정 스레드만 중단 가능). | - |
| JDK 11 | G1 GC | - 기본 GC가 G1 GC로 변경. - ZGC 도입 (실험적). - CMS GC 사용 중단 권고 (Deprecated). | ZGC |
| JDK 12 | G1 GC | - G1 GC에서 Abortable Mixed Collection 도입. - Shenandoah GC 도입 (실험적). | Shenandoah GC (실험적) |
| JDK 13 | G1 GC | - ZGC의 Heap 크기 제한(4TB) 제거. - G1 GC의 사용률 기반 Region 분할 개선. | - |
| JDK 14 | G1 GC | - ZGC 및 Parallel GC 성능 최적화. - G1 GC의 Adaptive 가비지 분류 개선. | - |
| JDK 15 | G1 GC | - ZGC 안정화 (정식 기능으로 전환). - Shenandoah GC 최적화. | - |
| JDK 16 | G1 GC | - ZGC 최대 Heap 크기를 16TB로 확장. - G1 GC의 Young Generation 정리 병렬화. | - |
| JDK 17 | G1 GC | - LTS(Long-Term Support) 릴리즈. - ZGC와 Shenandoah GC 성능 최적화. - CMS GC 완전히 제거. | - |
| JDK 18 | G1 GC | - ZGC에서 내부 메타데이터 GC 지원 추가. - Parallel GC에서 배리어 성능 개선. | - |
| JDK 19 | G1 GC | - ZGC에서 이동 중 객체 참조 안정성 강화. - G1 GC의 pause time 개선. | - |
| JDK 20 | G1 GC | - ZGC와 G1 GC 간의 Stop-the-World 최적화. - G1 GC Region 재배치 성능 개선. | - |
| JDK 21 | G1 GC | - Virtual Threads와 GC 최적화. - ZGC 및 Shenandoah GC에서 가비지 수집 병렬성 강화. | - |
지연 시간과 처리량 간의 균형이 잘 맞는 G1 GC를 주로 사용하고,
메모리 사용량이 거의 없다면 Serial GC를,
초저지연이 필요하다면 ZGC, Shenandoah GC를 생각해보자.