GC 모니터링

2021. 8. 13. 00:16Java/Garbage Collection

GC 모니터링이란

GC 모니터링이란 JVM이 어떻게 GC를 수행하고 있는지 알아내는 과정을 말합니다. 예를 들어 Young 영역에 있던 객체를 Old 영역으로 언제 얼마나 이동했는지, stop-the-world가 언제 일어나고 얼마동안 일어났는지 등의 정보를 알 수 있습니다. GC를 모니터링 하는 이유는 JVM이 효율적으로 GC를 수행하는지 파악하고 추가적인 GC 튜닝 작업이 필요한지 확인하기 위해서입니다. GC 모니터링으로 파악한 정보를 바탕으로 애플리케이션을 수정하거나 GC를 튜닝할 수 있습니다.

GC 모니터링 방법

jstat

jstat은 HotSpot JVM에 있는 모니터링 도구입니다. jstat 이외에 HotSpot JVM 모니터링 도구로는 jps와 statd가 있습니다. Java 애플리케이션을 모니터링 할 때에는 이 세 개의 도구를 모두 사용해야 할 경우도 있습니다. jstat은 GC 수행 정보를 보는 기능만 제공하는 것이 아닙니다. 클래스로더 수행 정보나 JIT 컴파일러 수행 정보 등도 jstat으로 알 수 있습니다.

jstat은 $JDK_HOME/bin 디렉터리 내부에 있습니다. 커맨드 라인에서 디렉터리를 지정하지 않고 java 명령어나 javac 명령어를 실행할 수 있다면 jstat도 바로 실행할 수 있습니다.

> jstat stat , S1C, S0U
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT  
3008.0 3072.0 0.0 1511.1 343360.0 46383.0 699072.0 283690.2 75392.0 41064.3 2540 18.454 4 1.133 19.588  
3008.0 3072.0 0.0 1511.1 343360.0 47530.9 699072.0 283690.2 75392.0 41064.3 2540 18.454 4 1.133 19.588  
3008.0 3072.0 0.0 1511.1 343360.0 47793.0 699072.0 283690.2 75392.0 41064.3 2540 18.454 4 1.133 19.588  

jstat의 옵션에 따른 컬럼 정보

칼럼설명jstat 옵션
S0CSurvivor 0 영역의 현재 크기를 KB 단위로 표시-gc -gccapacity -gcnew -gcnewcapacity
S1CSurvivor 1 영역의 현재 크기를 KB 단위로 표시-gc -gccapacity -gcnew -gcnewcapacity
S0USurvivor 0 영역의 현재 사용량을 KB 단위로 표시-gc -gcnew
S1USurvivor 1 영역의 현재 사용량을 KB 단위로 표시-gc -gcnew
ECEden 영역의 현재 크기를 KB 단위로 표시-gc -gccapacity -gcnew -gcnewcapacity
EUEden 영역의 현재 사용량을KB 단위로 표시-gc -gcnew
OCOld 영역의 현재 크기를 KB 단위로 표시-gc -gccapacity -gcold -gcoldcapacity
OUOld 영역의 현재 사용량을KB 단위로 표시-gc -gcold
PCPermanent영역의 현재 크기를 KB 단위로 표시-gc -gccapacity -gcold -gcoldcapacity -gcpermcapacity
PUPermanent영역의 현재 사용량을KB 단위로 표시-gc -gcold
YGCYoung Generation의 GC 이벤트 발생 횟수-gc -gccapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause
YGCTYong Generation의 GC 수행 누적 시간-gc -gcnew -gcutil -gccause
FGCFull GC 이벤트가 발생한 횟수-gc -gccapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause
FGCTFull GC 수행 누적 시간-gc -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause
GCT전체 GC 수행 누적 시간-gc -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause
NGCMNNew Generation의 최소 크기를 KB단위로 표시-gccapacity -gcnewcapacity
NGCMXNew Generation의 최대 크기를 KB단위로 표시-gccapacity -gcnewcapacity
NGCNew Generation의 현재 크기를 KB단위로 표시-gccapacity -gcnewcapacity
OGCMNOld Generation의 최소 크기를 KB단위로 표시-gccapacity -gcoldcapacity
OGCMXOld Generation의 최대 크기를 KB단위로 표시-gccapacity -gcoldcapacity
OGCOld Generation의 현재 크기를 KB단위로 표시-gccapacity -gcoldcapacity
PGCMNPermanent Generation의 최소 크기를 KB단위로 표시-gccapacity -gcpermcapacity
PGCMXPermanent Generation의 최대 크기를 KB단위로 표시-gccapacity -gcpermcapacity
PGC현재 Permanent Generation의 크기를 KB단위로 표시-gccapacity -gcpermcapacity
PCPermanent 영역의 현재 크기를 KB단위로 표시-gccapacity -gcpermcapacity
PUPermanent 영역의 현재 사용량을 KB단위로 표시-gc -gcold
LGCC지난 GC의 발생 이유-gccause
GCC현재 GC의 발생 이유-gccause
TTTenuring threshold. Young 영역 내에서 이 횟수만큼 복사되었을 경우(S0 ->S1, S1->S0) Old 영역으로 이동-gcnew
MTT최대 Tenuring threshold. Yong 영역 내에서 이 횟수만큼 복사되었을 경우 Old 영역으로 이동-gcnew
DSS적절한 Survivor 영역의 크기를 KB단위로 표시-gcnew

verbosegc 옵션

-verbosegc 옵션은 Java 애플리케이션을 가동할 때 지정하는 JVM 옵션 중 하나입니다. jstat은 특별한 옵션을 지정하지 않은 어떤 Java 어플리케이션에서도 모니터링 할 수 있는 반면, -verbosegc 옵션은 시작할 때 지정해야 하기 때문에 굳이 사용할 필요가 없는 옵션으로 이해할 수도 있습니다. 그러나 직관적으로 이해하기 쉬운 출력 결과를 GC가 발생할 때마다 보여주기 때문에 개략적인 GC 정보를 모니터링 할 때에는 아주 좋습니다.

-verbosegc 옵션을 사용하면 Minor GC가 발생할 때마다 다음과 같은 형식의 결과를 볼 수 있습니다.

[GC [<collector>: <starting occupancy1=""> -> <ending occupancy1="">, <pause time1=""> secs] <starting occupancy3=""> -> <ending occupancy3="">, <pause time3=""> secs]
 </pause></ending></starting></pause></ending></starting></collector>

jstat과 -verbosegc 옵션의 비교

728x90

'Java > Garbage Collection' 카테고리의 다른 글

G1 GC  (0) 2021.10.14
ZGC  (0) 2021.10.10
Shenandoah GC  (0) 2021.10.09
GC 튜닝  (0) 2021.08.12