やりたかったことは、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