[JVM] G1 Collector - 기본 튜닝

2021. 12. 16. 15:16 JAVA/JVM

튜닝 목표 : 잘 튜닝된 G1은 Full GC가 발생하지 않아야 한다!

Full GC 예방 방법
1) 힙 전체 크기 늘리기 & 제너레이션 간의 비율 조정
2) 백그라운드 스레드의 개수 늘리기
3) 백그라운드 스레드 자주 실행하기
4) 혼합 GC의 작업량 늘리기


MaxGCPauseMillis 를 통한 쉬운 튜닝
G1을 튜닝하는 방법은 많지만, G1의 목표중 하나는 손 쉬운 튜닝이다.
G1은 Throughput Collector 에서 봤던 플래그인
-XX:MaxGCPauseMillis=N 을 통해서 간단히 튜닝할 수 있도록 제공한다.

-XX:MaxGCPauseMillis = N (디폴트 200ms)
G1은 어떤 단계인지 상관없이 Stop-the-world가 발생하면 플래그 값을 읽고,
플래그가 기준값을 넘어서기 시작하면 아래와 같은 튜닝들을 스스로 시작한다.

힙 크기 조정 & 영 : 올드 제너레이션 비율 조정
백그라운드 처리 빠르게 시작
혼합 GC 동안 올드 제너레이션을 더 많이 처리

트레이드 오프
- 플래그 값이 줄어들면 중단 시간을 낮추기 위해 영 제너레이션의 크기는 줄어들지만, Minor GC는 더 자주 실행될 것이다. 
- 혼합 GC동안 수집될 수 있는 올드 제너레이션 영역의 수는 중단시간 목표에 맞춰서 줄어든다. 
  ==> Concurrent Mode Fail 가능성 상승

 

G1 튜닝하기
-XX:MaxGCPauseMillis=N을 통해서 자동으로 튜닝이 되지만, 세밀하게 튜닝하고 싶을 경우
- 힙크기, 백그라운드 스레드, 혼합 GC 튜닝을 알아보자

1) 힙 크기 튜닝하기
- 다른 GC 알고리즘의 튜닝 방법과 동일

[JVM] Throughput Collector - 힙 사이즈 튜닝하기


2) 백그라운드 스레드 개수 튜닝하기
- 주의! CPU가 충분할 것
- CMS 스레드 튜닝과 비슷하다. 단, 스레드를 늘릴때 사용되는 공식만 조금 다르다. 
 ==> ConcGCThreads = (ParallelGCThreads + 2) / 4

 

3) 백그라운드 스레드 자주 실행하도록 튜닝하기
-XX:InitiatingHeapOccupancyPercent = N (default : 45)
- 힙 점유율이 N값에 도달하면 Concurrent GC가 수행된다. 
( 주의! CMS 와 달리, 올드제너레이션의 점유율이 아닌 전체 힙의 점유율을 기반으로 한다. )
- 상수 값이다. 한번 설정되면 변하지 않는다. 다른 튜닝 목적으로 플래그 값이 변경되지 않음.
- 값이 너무 높으면, Concurrent GC가 완료되어 가비지가 수거되기 전에 힙이 꽉차서 Full GC 가 발생한다. 
- 값이 너무 작으면, Concurrent GC가 자주 수행된다. Concurrent GC 에는 Minor GC 가 포함되어 있기 때문에 짧은 중단이 더 자주 일어날 수 있다.



4) 혼합 GC 작업량 튜닝하기
- G1 은 표시 모드 때 표시된 영역이 전부 수집되기 전까지 새로운 Concurrent GC를 시작할 수 없다
- 혼합 GC 단계에서 반복해서 표시된 영역을 수집하기 때문에 혼합 GC가 한번에 많은 양을 처리하면 좋다. 단, 혼합 GC 중단 시간이 길어지는 트레이드 오프가 있다.  

혼합 GC의 작업량은 3가지에 의존한다.
4-1) 가비지가 존재한다고 표시된 영역의 수
- 이것을 직접적으로 튜닝할 수 있는 방법은 없다
- 35%가 가비지면, 가비지 컬렉션 대상으로 표시한다
- 실험용 빌드 버전에서는 변경할 수 있다. -XX:G1MixedGCLiveThresholdPercent=N

4-2) -XX:G1MixedGCCountTarget=N (Default : 8)
- 한번의 혼합 GC때 처리할 영역의 개수
- 값이 줄어들면 혼합 GC는 여러번의 주기를 거쳐서 가비지를 수거하므로 중단시간이 더 길어지지만,
대신 빠르게 자리를 비워주므로 승격 실패를 예방하는데 도움이 된다.
- XX:MaxGCPauseMillis 값으로 제한된 시간 내에 처리될 수 있어야 한다. 처리될 수 없으면 해당 MaxGcPauseMillis플래그가 우선된다. 

4-3) -XX:MaxGCPauseMillis=N
- 최대 GC 중단 시간이 허용한다면, 혼합 GC는 더 많은 양을 수집할 것이다. 
- MaxGCPauseMillis 값이 늘어나면, 한번의 혼합 GC때 많은 양을 수집할 수 있다. 결국 G1은 새로운 Concurrent GC를 빠르게 시작할 수 있다.