2021. 8. 13. 00:16ㆍJava/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 옵션 |
S0C | Survivor 0 영역의 현재 크기를 KB 단위로 표시 | -gc -gccapacity -gcnew -gcnewcapacity |
S1C | Survivor 1 영역의 현재 크기를 KB 단위로 표시 | -gc -gccapacity -gcnew -gcnewcapacity |
S0U | Survivor 0 영역의 현재 사용량을 KB 단위로 표시 | -gc -gcnew |
S1U | Survivor 1 영역의 현재 사용량을 KB 단위로 표시 | -gc -gcnew |
EC | Eden 영역의 현재 크기를 KB 단위로 표시 | -gc -gccapacity -gcnew -gcnewcapacity |
EU | Eden 영역의 현재 사용량을KB 단위로 표시 | -gc -gcnew |
OC | Old 영역의 현재 크기를 KB 단위로 표시 | -gc -gccapacity -gcold -gcoldcapacity |
OU | Old 영역의 현재 사용량을KB 단위로 표시 | -gc -gcold |
PC | Permanent영역의 현재 크기를 KB 단위로 표시 | -gc -gccapacity -gcold -gcoldcapacity -gcpermcapacity |
PU | Permanent영역의 현재 사용량을KB 단위로 표시 | -gc -gcold |
YGC | Young Generation의 GC 이벤트 발생 횟수 | -gc -gccapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause |
YGCT | Yong Generation의 GC 수행 누적 시간 | -gc -gcnew -gcutil -gccause |
FGC | Full GC 이벤트가 발생한 횟수 | -gc -gccapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause |
FGCT | Full GC 수행 누적 시간 | -gc -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause |
GCT | 전체 GC 수행 누적 시간 | -gc -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause |
NGCMN | New Generation의 최소 크기를 KB단위로 표시 | -gccapacity -gcnewcapacity |
NGCMX | New Generation의 최대 크기를 KB단위로 표시 | -gccapacity -gcnewcapacity |
NGC | New Generation의 현재 크기를 KB단위로 표시 | -gccapacity -gcnewcapacity |
OGCMN | Old Generation의 최소 크기를 KB단위로 표시 | -gccapacity -gcoldcapacity |
OGCMX | Old Generation의 최대 크기를 KB단위로 표시 | -gccapacity -gcoldcapacity |
OGC | Old Generation의 현재 크기를 KB단위로 표시 | -gccapacity -gcoldcapacity |
PGCMN | Permanent Generation의 최소 크기를 KB단위로 표시 | -gccapacity -gcpermcapacity |
PGCMX | Permanent Generation의 최대 크기를 KB단위로 표시 | -gccapacity -gcpermcapacity |
PGC | 현재 Permanent Generation의 크기를 KB단위로 표시 | -gccapacity -gcpermcapacity |
PC | Permanent 영역의 현재 크기를 KB단위로 표시 | -gccapacity -gcpermcapacity |
PU | Permanent 영역의 현재 사용량을 KB단위로 표시 | -gc -gcold |
LGCC | 지난 GC의 발생 이유 | -gccause |
GCC | 현재 GC의 발생 이유 | -gccause |
TT | Tenuring 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 옵션의 비교
'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 |