最近頻繁に手元で起動したsbtがjava.lang.OutOfMemoryError: Metaspaceで死ぬので、メモリ使用状況を確認するコマンドを調べた。備忘録として残しておく。
の記事が参考になる。
jpsとjstatを利用する。この二つはJDKに含まれているのでインストールされていれば利用可能。
まずjpsでJVMが動いているプロセスを特定する。
$ 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の利用状況を知る方法でした。