공부

Garbage Collection(3) - Java GC Tuning

프로필사진
fienestar
2023. 1. 16. 07:12

이전 포스팅에서는 자바의 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 에서 보실 수 있습니다.