[JVM] Throughput Collector - 힙 사이즈 튜닝하기
- 전체 힙 크기
- 올드 / 영 제너레이션의 비율
- GC로 인한 중단시간
- 트레이드 오프 : 힙크기 증가 => Full GC 중단 횟수 감소 => Full GC 중단시간 증가
- 힙크기는 크다고 좋은게 아니다
- 256MB의 작은 힙에서는 전체시간의 35%정도를 GC를 수행한다
- 힙크기가 일정크기를 넘어서면 처리율이 하락 => Full GC 수행시간 증가!
- 최적의 처리율을 갖는 힙 크기를 결정하는 것이 중요
- 어플리케이션 실행 & 모니터링의 반복? (X)
- Adaptive Size Policy 자동크기조정 기능을 사용하고 JVM이 알아서 결정하도록 내버려두자!
무엇이 "최적"일까?
- JVM에게 "최적"이 무엇인지 성능 목표를 제시해야 된다
- 성능 목표 플래그 두 가지 : -XX:MaxGCPauseMillis = N , -XX:GCTimeRatio = N
1) MaxGCPauseMillis = N (Default : 미설정)
- GC로 인한 최대 중단시간을 명시
- (주의!) Minor GC, Full GC 모두에게 적용된다. 이상적인 값을 사용해야 한다!
EX. MaxGCPauseMillis = 50ms을 지정할 경우
=> Full GC 도 50ms 내에 수행될 정도로 작은 올드 제너레이션을 사용
=> 매우 자주 Full GC 수행됨!
2) GCTimeRatio = N (Default : 99)
- 어플리케이션 실행시간 : GC 실행시간 비율 설정
- Default ==> 전체의 1% 시간만 GC 실행, 나머지 99% 어플리케이션 실행
- (주의!) 직관적인 숫자가 아니다!
Ex. GCTimeRatio=95 라고해서 GC가 5%라는 의미가 아니다
=> 공식을 거쳐서 계산해야 됨
- 공식 : GCTimeRatio = (처리율 목표 ) / (1 - 처리율 목표)
EX. 처리율 목표가 95%의 어플리케이션 실행일 경우
=> 0.95 / (1 - 0.95 ) = 19
=> GCTimeRatio = 19로 설정
- 성능목표에 따라 설정할 것! 보통 19(GC 5%)로 처음에 사용한다
우선순위 MaxGCPauseMillis > GCTimeRatio
- JVM은 -Xms ~ -Xmx 범위 내에서 MaxGCPauseMillis, GCTimeRatio를 만족시키기 위해 힙 크기를 자동으로 조절한다.
- MaxGCPauseMillis의 우선순위가 더 높다
- 동작 예
1) MaxGCPauseMillis 를 만족시킬 때까지 힙 크기 조정
2) GCTimeRatio를 만족시킬 때까지 힙 크기 증가
==> 결국 두 플래그를 만족시키는 가장 작은 힙 크기로 설정된다
- 보통 GCTimeRatio만 사용하는 경우가 많다. 이럴 경우 GCTimeRatio를 만족시킬 때까지 힙 크기가 증가한다.
MaxGCPauseMillis, GCTimeRatio 설정 예시 1
- GCTimeRatio는 디폴트로 1%가 목표
- 플래그를 설정한 경우 MaxGCPauseMillis=50ms 목표를 이루기 위해 힙크기 감소
- Xms=Xmx=2048m로 힙크기를 크게 준 경우를 주목!
==> 힙크기를 크게 줘도 처리율은 모두 동일하다!
==> GC 시간 비율이 많이 낮지만 처리율이 의미가 없다! 오히려 나중에 Full GC가 오랫동안 발생할 수 있다.
MAXGCPauseMillis, GCTimeRatio 설정 예시 2
- Default : 플래그가 설정되지 않은 디폴트를 보면, 힙크기를 1.7G까지 늘리면서 디폴트 GCTimeRatio 1% GC시간을 맞추기 위해 최선을 다하지만 실패한다.
- MaxGCPauseMillis=50ms :
==> 비현실적인 목표 ==> 상황악화
==> GC시간을 50ms로 맞추기 위해 힙크기 감소
==> GC 너무 자주 발생 ==> GC시간 증가 & 처리율 감소
- Xms=XmX=2048m : 이번 시나리오의 최적의 조건, 정답 힙크기
- Xmx=3560m; MaxGCRatio=19 :
==> 최대 범위 내에서 합리적인 목표 플래그 설정
==> 최적의 힙크기 2GB와 비슷한 수준, 처리율은 동일!!
'JAVA > JVM' 카테고리의 다른 글
[JVM] G1 Collector - GC Log (0) | 2021.12.16 |
---|---|
[JVM] CMS Collector - PERM 튜닝 (0) | 2021.12.16 |
[JVM] CMS Collector - 힙 사이즈 / Concurrent Mode 튜닝하기 (0) | 2021.12.16 |
[JVM] CMS Collector - GC Log (0) | 2021.12.16 |
[JVM] Throughput Collector - GC Log (0) | 2021.12.16 |
[JVM] 기본 GC 튜닝 (0) | 2021.12.16 |
[JVM] GC 알고리즘 - Overview (0) | 2021.12.16 |
[JVM] JIT 컴파일 로그, 컴파일 스레드, 인라이닝 튜닝 (0) | 2021.12.16 |