Java GC Tuning
2023-01-16
이전 포스팅에서는 자바의 Garbage Collection
에 대해 다뤘습니다. 이번 포스팅에서는 Garbage Collection
을 수행하는 Garbage Collector
를 애플리케이션에 맞게 튜닝하는 방법에 대해 알아봅시다.
Garbage Collector
와Garbage Collection
는 이니셜이 같아 둘 모두GC
라고 부릅니다.
Garbage Collectors
* 이 포스팅에서 다루는 java의 버전은 18입니다.
- Serial GC
-XX:+UseSerialGC
- Parallel GC
-XX:+UseSerialGC
- ~Concurrent Mark Sweep(CMS) GC~(Removed)
- Garbage-First(G1) GC
-XX:+UseG1GC
- Z GC
-XX:UseZGC
- Shenandoah GC
-XX:+UseShenandoahGC
- Epsilon GC(Experimental)
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
위와 같은 다양한 Garbage Collector가 있으나, 각각의 구체적인 구현은 다루지 않습니다. 구현 코드가 궁금하면 openjdk/src/hotspot/share/gc를 참조하시길 바랍니다.
Epsilon GC는 Experimental임에도 신기해서 넣었는데, 아무것도 하지 않는 gc입니다. 메모리를 할당할수록 소모되기만 합니다. 메모리 해제가 필요하지 않고, 첫 메모리로 충분한 경우나 테스트를 위해 사용하시면 됩니다.
-XX:+UnlockExperimentalVMOptions
-XX:+UseEpsilonGC
GC를 선택하기위해, 다음과 같은 기준을 고려할 수 있습니다.
- 시간 대비 처리량(처리 속도)
- 단일 Stop The World(STW) 대기 시간(단일 GC 처리 시간)
Oracle의 Garbage Collector 선택 가이드라인을 번역하면 다음과 같습니다.
- 총 메모리 100MB 이하 -> Serial GC
-XX:+UseSerialGC
- 싱글 프로세서 and STW가 중요하지 않은 경우 -> Serial GC
-XX:+UseSerialGC
- 성능 최우선이며 1초 이상 STW가 일어나도 괜찮은 경우 -> Parallel GC
-XX:+UseParallelGC
- 응답 시간 최우선이며 STW가 작아야하는 경우 -> G1 GC
-XX:+UseG1GC
- 응답 시간아 중요한 경우 -> Z GC
-XX:UseZGC
GC 선택이 완료되면, 다음 옵션들을 고려할 수 있습니다.
- 메모리 최소:
-Xms{size}
- 메모리 최대:
-Xmx{size}
- Young:Old 크기 비율:
-XX:NewRaito
- Young의 크기:
-XX:NewSize
- Eden:Survivor 크기 비율:
-XX:Survivor Raito
다음 포스팅에서는 Reference Object에 대해 다룹니다
- 2021년 동아리 세미나에서 발표한 자료를 글로 다시 정리한 것입니다.
- 발표 ppt는 https://fienestar.github.io/ppt/java-gc 에서 보실 수 있습니다.