OSのメモリ利用量を監視する場合、vmstatなどを利用するかと存じますが、JVMのヒープメモリが確保している量や、使用量を確認する場合はjstatを利用します。通常であれば、JFRやVisualVMなどGUIツールを利用するかと存じますが、それらが利用できないような環境ではコマンドラインから情報を取得するしかありません。本投稿は、そのような環境でJVMの情報を取得した経験を踏まえて、手順を残したいと思います。
######※初めて知ったけど・・・
こんな記事を書こうとして、以下のような公式記事を見つけました。
jstatは公式のツールではなく、試験的な機能らしい
OTN-jstat
環境
・Mac OS X(10.10.5)
・java 1.8.0_92
・apache-tomcat-8.0.36
実施内容
Tomcatを起動しておき、 稼働しているJVMの情報をjstatで取得する
##環境の整理
tomcatの配置と起動
$ ls -l /make
drwxr-xr-x@ 14 kusakai wheel 476 6 21 22:42 apache-tomcat-8.0.36
$ /make/apache-tomcat-8.0.36/bin/startup.sh
Using CATALINA_BASE: /make/apache-tomcat-8.0.36
Using CATALINA_HOME: /make/apache-tomcat-8.0.36
Using CATALINA_TMPDIR: /make/apache-tomcat-8.0.36/temp
Using JRE_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
Using CLASSPATH: /make/apache-tomcat-8.0.36/bin/bootstrap.jar:/make/apache-tomcat-8.0.36/bin/tomcat-juli.jar
Tomcat started.
$ps aux |grep java
kusakai 988 0.1 2.6 4971380 110704 s000 〜
##jstatの確認と実行
javaからプロセスを確認して、情報を取得します
$ jps
1121 Jps #jpsコマンドのプロセス
988 Bootstrap #tomcat(JVM)のプロセス
# 上のtomcat起動後、psコマンドでも出力された通り
# PID988のJVM情報を取得します
$jstat -gc 988
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
2560.0 2560.0 2540.0 0.0 32768.0 22237.8 44032.0 15113.8 16256.0 15773.4 1920.0 1776.1 4 0.036 0 0.000 0.036
それぞれの意味は、以下リンク先の通りです
公式ドキュメント
##jstatの出力と、VisualVMの出力を比較する
VisualVM
$ /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/bin/jvisualvm
$ jstat -gc 988
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
9216.0 6144.0 0.0 5895.0 30720.0 16788.6 40448.0 16309.2 27136.0 26181.9 3072.0 2731.4 7 0.073 1 0.080 0.153
9216.0 6144.0 0.0 5895.0 30720.0 17003.7 40448.0 16309.2 27136.0 26181.9 3072.0 2731.4 7 0.073 1 0.080 0.153
9216.0 6144.0 0.0 5895.0 30720.0 17218.8 40448.0 16309.2 27136.0 26181.9 3072.0 2731.4 7 0.073 1 0.080 0.153
9216.0 6144.0 0.0 5895.0 30720.0 17218.8 40448.0 16309.2 27136.0 26181.9 3072.0 2731.4 7 0.073 1 0.080 0.153
9216.0 6144.0 0.0 5895.0 30720.0 17433.9 40448.0 16309.2 27136.0 26181.9 3072.0 2731.4 7 0.073 1 0.080 0.153
VisualVMを見ると、確保済み110 〜 120MB、使用済み25 〜 40MBとなっています。jstatでは各領域をKBで表示しているため、ほぼ同タイミングで確認してみると、、、
確保済み領域の確認
(9216.0[S0C] + 6144.0[S1C] + 30720.0[EC] + 40448.0[OC] + 27136.0[MC]) / 1024 = 111MB
使用済み領域の確認
(0.0[S0U] + 5895.0[S1U] + 17433.9[EU] + 16309.2[OU]) / 1024 = 38MB
以上でVisualVMと同等の値が取得できています。今後、30分程度の期間継続して情報を取得して内容を比較してみる予定です。