JavaFlightRecorderでheapの使用状況を確認する


やりたかったことは、jcmdを利用してjfrファイルをWebアプリケーションサーバで取得し、開発用の自分のPC(Windows)のjmcでheapの使用状況を確認する、ことでした。

基本情報

  • 執筆:2019/1/17
  • OS:RHEL7.4
  • Java1.8

結論(解決に時間がかかったところ)

jfrファイルにheapの利用状況データを記録するためにはプロファイルを修正し、jcmdのsettingsパラメータとして渡す必要がある。(探し方が悪かったのか、辿り着くのにかなり時間がかかった。)

手順

1.プロファイルの修正

以下に2種類のプロファイルが格納されています。

$ cd [JDK_PATH]/jre/lib/jfr
$ ll
-rw-r--r-- 1 root root 20109 10月  6 22:55 default.jfc
-rw-r--r-- 1 root root 20065 10月  6 22:55 profile.jfc

profile.jfcをコピーし(myProfile.jfc)、heapのデータ記録に関すると思われる部分を有効化します。この辺りのリファレンスが見つけられなかったため、これは正しいかは定かではありません。(が、一応動きます。)

<!-- 127行目あたり、falseからtrueへ -->
<flag name="heap-statistics-enabled" label="Heap Statistics">true</flag>

<!-- 268行目あたり、falseからtrueへ -->
    <event path="vm/gc/detailed/object_count">
      <setting name="enabled" control="heap-statistics-enabled">true</setting>
      <setting name="period">everyChunk</setting>
    </event>

2.jfrファイルの取得

詳細情報は割愛しますが、ポイントはsettingsパラメータで先に作成したプロファイルを指定するところです。

jcmd [PID] JFR.start name=MyJfrRec settings=myProfile maxsize=100mb dumponexit=true filename=/tmp/myJfrRec.jfr

記録状況のチェック

jcmd [PID] JFR.check

記録情報のダンプ

jcmd [PID] JFR.dump name=MyJfrRec filename=/tmp/mytasrec.jfr

記録の終了

jcmd [PID] JFR.stop name=MyJfrRec

あとは、取得されるjfrファイルをjmcに読み込ませれば良い感じでグラフが出てくれると思います。

【参考にさせて頂いたサイト】
http://waysaku.hatenablog.com/entry/2014/07/22/005304
https://blogs.oracle.com/poonam/clarifying-some-confusion-around-java-flight-recordings

弊社ではエンジニアを募集中です。こちらも見て頂けると嬉しいです。
https://www.nittsu-infosys.com/recruit/2019/index.html