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