日々精進

新しく学んだことを書き留めていきます

Javaアプリのメモリリーク調査方法

以下の二つのやり方がある。

  • メモリダンプを取る

以下のコマンドでダンプを取る。

jmap -dump:format=b,file=heap.bin <PID>

Eclipse Memory Analyzerでダンプを見る。

参考:

hkawabata.github.io

  • Java Flight Recorderでログを取る

こっちの方がより詳細な情報がとれる。Oracle Java8にはFlight Recorderが入っている。OpenJDKにも11ぐらいから入っているらしい。

docs.oracle.com

qiita.com

以下のコマンドでJavaアプリを起動すると起動から30分後に.jfrファイルが出力される。

/opt/java/jdk1.8.0_221/bin/java -Xms1g -Xmx1g -Djava.net.preferIPv4Stack=true -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=name=on_startup,filename=./log/record.jfr,settings=./log/template.jfc,dumponexit=true,duration=30m -Dfile.encoding=UTF-8 -jar `ls /home/ec2-user/server/*.jar`

mission controlをダウンロードして.jfrを開くと時系列でメモリ使用量の変化が分かったり、どのオブジェクトがどのメソッドから作られているのかがわかったりする。

www.oracle.com