以下の二つのやり方がある。
- メモリダンプを取る
以下のコマンドでダンプを取る。
jmap -dump:format=b,file=heap.bin <PID>
Eclipse Memory Analyzerでダンプを見る。
参考:
- Java Flight Recorderでログを取る
こっちの方がより詳細な情報がとれる。Oracle Java8にはFlight Recorderが入っている。OpenJDKにも11ぐらいから入っているらしい。
以下のコマンドで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を開くと時系列でメモリ使用量の変化が分かったり、どのオブジェクトがどのメソッドから作られているのかがわかったりする。