티스토리 뷰
GC모니터링
JVM이 어떻게 GC를 수행하는지를 알아내는 과정을 말하는데, Young영역에서 Old영역으로 얼마나 이동했는지,
Stop-The-World가 언제 일어나고 얼마동안 일어났는지 정보를 알 수 있다.
또한, 때에 따라서 GC튜닝이 필요한지 안한지 확인하기 위해서다.
모니터링방법
1.jstat
HotSpot JVM에 있는 모니터링 도구이다. 그외 HotSpot JVM 모니터링 도구로는 jps나 jstatd가 있다.
jstat은 GC수행정보 뿐 아니라 클래스로더 수행정보나 Just In Time 컴파일러 수행정보도 알 수 있다.
jstat은 $JAVA_HOME/bin 디렉토리에 있다.
환경변수로 설정한 $JAVA_HOME 을 불러오는 방법 (운영체제, 프롬프트에 따라 명령어가 다르다 -_-)
window [cmd.exe] : echo %JAVA_HOME%
window [gitbash] : echo $JAVA_HOME
window [powershell] : Get-ChildItem Env:JAVA_HOME OR echo $env:JAVA_HOME
프로세스 ID 구하는 방법 $JAVA_HOME/bin 디렉토리에서 jps.exe 실행 << 이방법은 WAS가 여러개 실행되고있을때는
부트스트랩 정보만 나타내기 때문에 ps -ef|grep java 명령어를 함께 사용한다.
jstat -gc <vmid> 1000 10' 이라고 하면 1초마다 한번씩 총 10회 GC모니터링 정보를 출력한다.
GC와 관련된 옵션을 소개하면 다음과 같다.
옵션 | 기능 |
gc | 각 힙영역의 현재 크기와 현재사용량, 총 GC수행 횟수, 누적 GC 소요시간을 보여준다. |
gccapacity | 각 힙 영역의 최소크기(ms), 최대 크기(mx), 현재크기, 각 영역별 GC수행 횟수를 알 수 있는 정보를 보여준다. 단 현재 사용량과 누적GC소요시간은 알 수 없다. |
gccause | -gcutil옵션이 제공하는 정보와 함께 마지막 GC원인과 현재 발생하고 있는 GC의 원인을 알 수 있는 정보를 보여준다. |
gcnew | New 영역에 대한 GC 수행 정보를 보여준다 |
gcnewcapacity | New 영역의 크기에 대한 통계 정보를 보여준다. |
gcold | Old 영역에 대한 GC 수행정보를 보여준다. |
gcoldcapacity | Old 영역의 크기에 대한 통계정보를 보여준다. |
gcpermcapcity | Permanent 영역에 대한 통계정보를 보여준다 |
gcutil | 각 힙영역에 대한 사용정도를 백분율로 보여준다 . 아울러 총 GC수행 횟수와 누적 GC시간을 알 수 있다. |
jstat 명령어 수행 jstat -gcutil -h20 -t processId 2000 3000
gcutil : gcutil에 대해서 수행
h20 : 20라인마다 header 찍음
-t : time stamp 찍음 (JVM이 스타트 된 이후의 시간)
2000 : interval(ms단위) 2초
3000 : count (회)
칼럼 | 설명 |
S0 | Survivor 영역 0의 사용률(현재의 용량에 대한 퍼센티지) |
S1 | Survivor 영역 1의 사용률(현재의 용량에 대한 퍼센티지) |
E | Eden 영역의 사용률(현재의 용량에 대한 퍼센티지) |
O | Old 영역의 사용률(현재의 용량에 대한 퍼센티지) |
P | Parameter 영역의 사용률(현재의 용량에 대한 퍼센티지) |
YGC | Young 세대의 GC 이벤트 수 |
YGCT | YOUNG 세대의 가베지 콜렉션 시간 |
FGC | 풀 GC 이벤트 수 |
GCT | 가베지 콜렉션 총 시간 |
2.-verbosegc 옵션
-verbosegc 옵션은 Java애플리케이션을 가동할때 지정하는 JVM옵션 가운데 하나이다. jstat은 특별한 옵션을 지정하지
않은 어떤 Java애플리케이션도 모니터링할 수 있으나, -verbosegc옵션은 시작할 때 지정해야 하기 때문에 굳이 사용할
필요가 없는 옵션으로 이해할 수도 있다. 그러나 직관적으로 이해하기 쉬운 출력결과를 GC가 발생할 때마다 보여주기
때문에 개략적인 GC정보를 모니터링 할때 아주 좋다.
jstat VS -verbosegc 옵션
jstat | -verbosegc | |
모니터링 대상 | 터미널에 로그인 할 수 있는 머신에서 가동중인 JAVA애플리케이션이거나 jstatd를 통하여 네트워크로 연결할 수 있는 리모트 JAVA애플리케이션 |
JVM 시작 옵션으로 -verbosegc를 지정한 JAVA애플리케이션에 대해서만 |
출력 정보 | 힙상태(사용량,최대크기,GC횟수/시간등) | New 영역과 Old 영역에 대한 GC 이전/ 이후 크기와 수행시간 |
출력 시기 | 지정한 시간 간격마다 | GC 발생시 |
유용할 때 | 힙 영역의 크기 변화를 관찰 할때 | 한번의 GC에 대한 효과 |
-verbosegc 의 부가 옵션들
1. -XX:+PrintGCDetails
2. -XX:+PrintGCTimeStamps
3. -XX:+PrintHeapAtGC
4. -XX:+PrintGCDateStamps
만약 -verbosegc옵션만 사용한다면 -XX:+PrintGCDetails옵션이 기본 적용된다.
-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>
Collector : MinorGC를 위해 사용하는 컬렉터이름
starting occupancy1 : GC전 Young 영역의 크기
ending occupancy1 : GC 후 Young 영역의 크기
pause time1 : Minor GC를 위해 Java 애플리케이션이 수행을 멈춘 시간
starting occupancy3 : GC전 전체 힙 크기
ending occupancy3 : GC 후 전체 힙 크기
pause time3 : Major GC를 포함하여 전체 힙 GC를 위해 Java애플리케이션 수행을 멈춘 시간
Minor GC의 출력 결과
[GC [DefNew: 4032K->64K(4032K), 0.0429742 secs] 9350K->7748K(32704K), 0.0431096 secs] [GC [DefNew: 4032K->64K(4032K), 0.0403446 secs] 11716K->10121K(32704K), 0.0404867 secs]
Full GC 출력 결과
[Full GC [Tenured: 3485K->4095K(4096K), 0.1745373 secs] 61244K->7418K(63104K), [Perm : 10756K->10756K(12288K)], 0.1762129 secs] [Times: user=0.19 sys=0.00, real=0.19 secs]
CMS Collector를 사용하면 다음과 같은 CMS정보도 얻을 수 있다
[CMS-concurrent-mark: 0.129/0.129 secs] [CMS-concurrent-preclean: 0.007/0.007 secs] … [CMS-concurrent-sweep: 1.208/1.208 secs] [CMS-concurrent-reset: 0.036/0.036 secs]
CMS Collector 란?
Concurrent Mark Sweep Collector 인데, -XX:+UseConcMarkSweepGC 옵션으로 사용할 수 있으며,
대부분의 가비지 컬렉션 작업을 애플리케이션 스레드와 동시에 수행함으로써 가비지 컬렉션으로 인한
Stop The World 시간을 최소화 하는 GC이다.
-verbosegc 옵션은 GC이벤트가 발생할 때마다 로그를 출력하기 때문에, GC수행으로 인한 힙 사용률 변화를 알기 쉽다.
GUI 방식의 GC프로파일링 / 모니터링 툴
VisualVM + Visual GC
Java VisualVM은 Oralcle JDK가 제공하는 GUI 프로파일링 / 모니터링 툴이다.
https://visualvm.github.io/ 다운로드 링크
JDK에 포함된 버전이 아닌 경우 홈페이지에서 Visual VM을 내려받을 수 있다.
JDK 포함 버젼은 Java Visual VM(jvisualvm)이라 하고, 홈페이지에서 받는 버전을 Visual VM(visualvm)이라고 부른다.
기능은 비슷하나 플러그인 설치등 기능 차이가 약간 있다.
Visual VM에서 해당 JVM을 클릭 후 Monitor를 노르면 현재 GC와 힙의 개략적인 상황을 알 수 있다.
(필자는 Eclipse를 사용중이다.)
jstat만큼 자세한 정보를 원한다면
상단 탭의 Tools - Plugins를 선택해서 AvailablePlugins를 선택하여 Install해주면 된다. (필자는 이미 설치했다.)
Visual GC를 킨 모습이다. Heap 영역에 대한 정보를 자세히 알 수 있고, GC Time에 대한 정보도 있어 유용하다.
HPJMeter
HPJMeter는 -verbosegc옵션의 출력 결과 분석을 쉽게 해주는 툴이다.
아직 -verbosegc를 사용해 보지 않아 사용 후기는 다음에 남기려고 한다.
많은글들을 읽어보았지만 jstat로 간략한 모니터링을 하고 이상증상 발생시에는 -verbosegc옵션으로 GC를 분석한다고
한다. 실질적인 문제들은 배포버전에서 생기므로 리눅스 환경에서 사용하는 방법을 좀 더 공부해봐야겠다.
JVM GC 모니터링
JVM에 Garbage Collector 의 모니터링에 대해 알아보자 jstat jstat은 HotSpot JVM에 있는 모니터링 도구이다. jstat 이외에 HotSpot JVM 모니터링 도구로는 jps와 jstatd가 있다. Java 애플리케이션을 모니터링할..
neocan.tistory.com
Garbage Collection 모니터링 방법 (naver.com)
'JAVA공부 > JVM' 카테고리의 다른 글
자바 Heap Dump (0) | 2022.11.04 |
---|---|
GC 튜닝 (0) | 2022.01.14 |
GC(Garbage Collection) 컬렉션 과 Heap 영역 (0) | 2022.01.06 |
JVM 기초 원리 (0) | 2021.12.31 |
JDK, JRE (0) | 2021.12.30 |