이전 포스팅에서는 자바의 Garbage Collector에 대해 다뤘습니다. 이번 포스팅에서는 Garbage Collector를 애플리케이션에 맞게 튜닝하는 방법에 대해 알아봅시다.
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는 신기해서 넣었는데, 아무것도 하지 않는 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 에서 보실 수 있습니다.
'공부' 카테고리의 다른 글
java의 field 초기화와 동시성 (0) | 2023.06.15 |
---|---|
Garbage Collection(4) - Weak Reference (0) | 2023.01.16 |
Garbage Collection(2) - Java GC (0) | 2023.01.16 |
Garbage Collection(1) - 탈출 분석과 참조 카운팅, 추적 (1) | 2023.01.16 |