cat 2023-01-16-Java-GC-Tuning.md

Java GC Tuning


2023-01-16

이전 포스팅에서는 자바의 Garbage Collection에 대해 다뤘습니다. 이번 포스팅에서는 Garbage Collection을 수행하는 Garbage Collector를 애플리케이션에 맞게 튜닝하는 방법에 대해 알아봅시다.

  • Garbage CollectorGarbage 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에 대해 다룹니다