$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

jstatを使うとJVMのメモリ使用状況が分かる

最近頻繁に手元で起動したsbtがjava.lang.OutOfMemoryError: Metaspaceで死ぬので、メモリ使用状況を確認するコマンドを調べた。備忘録として残しておく。

の記事が参考になる。

jpsとjstatを利用する。この二つはJDKに含まれているのでインストールされていれば利用可能。

まずjpsJVMが動いているプロセスを特定する。

$ jps -v
60820 Main
55060 sbt-launch.jar -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256m
76790 Main
1067  -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseCompressedOops -Dfile.encoding=UTF-8 -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Xverify:none -XX:ErrorFile=/Users/shibayu36/java_error_in_idea_%p.log -XX:HeapDumpPath=/Users/shibayu36/java_error_in_idea.hprof -Djb.vmOptionsFile=/Applications/IntelliJ IDEA CE.app/Contents/bin/idea.vmoptions -Didea.java.redist=jdk-bundled -Didea.home.path=/Applications/IntelliJ IDEA CE.app/Contents -Didea.executable=idea -Didea.platform.prefix=Idea -Didea.paths.selector=IdeaIC2018.3
55853 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home -Xms8m

今見たいJVMのプロセスが55060 sbt-launch.jar -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxMetaspaceSize=256mだとすると、プロセスIDは55060なので次のコマンドでメモリ状況が分かる。-tはタイムスタンプをつけるオプション、-h5は5行ごとにヘッダを出すオプション、最後の1000は1秒ごとに統計情報を出力するオプション。

$ jstat -gc -t -h5 55060 1000
Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
         1054.8 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
         1055.8 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
         1056.8 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
         1057.8 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
         1058.8 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
         1059.9 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
         1060.9 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
         1061.8 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
         1062.8 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711
         1063.9 76800.0 78336.0 53909.3  0.0   192512.0 179123.1  699392.0   75597.7   106496.0 94784.9 13056.0 12218.8     20    0.296   5      0.415    0.711

この中でMetaspaceのCapacityはMCの106496.0KB、Metaspaceで実際に利用している使用量はMUの94784.9KBとなる。この値がMaxMetaspaceSizeに指定された256MBを超えるとjava.lang.OutOfMemoryError: Metaspaceで死ぬ。


以上、簡単にMetaspaceの利用状況を知る方法でした。