Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。
概要
Java Flight Recorder(JFR)について、JFRとJava Mission Control(JMC)の使い方を学びました。
今回は、アプリケーションの起動後にJFRを実行することをやってみます。JFRで情報を取りたいというときは、このアプリケーション起動後に実行する場合がほとんどだと思います。
対象アプリケーション
以前の記事と同じく、Spring Bootで定期的に現在日時を出力するアプリケーションを使います。
https://spring.io/guides/gs/scheduling-tasks/を参照、もしくは上記の記事を読んでいただいてアプリケーションを起動してください。
$ java -jar build/libs/gs-scheduling-tasks-0.1.0.jar
jcmd
みなさんはjcmdというコマンドをご存知でしょうか?Javaにはjstackやjmapなどなどいろいろなコマンドがありましたが、JDK 7から導入されたjcmdだけでそれら全部と同じことを実行できるようになっています。
「jcmdユーティリティを使用してJVMに診断コマンド・リクエストを送信し、JVMではこれらのリクエストを使用してJavaフライト記録の制御、トラブルシューティング、JVMおよびJavaアプリケーションの診断を行います。JVMが実行されているものと同じマシン上で使用され、JVMの起動で使用されたものと同じ有効なユーザーおよびグループ識別子を持っている必要があります。」
https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/tooldescr006.html
Javaフライト記録、というのがJFRの日本語訳です。
ではjcmdを使ってみましょう。
$ jcmd
46224 sun.tools.jcmd.JCmd
34369 build/libs/gs-scheduling-tasks-0.1.0.jar
オプションをつけなければ起動しているJavaのプロセスIDを出力します。
そのプロセスで使用できるコマンドは、helpオプションで見ることができます。
$ jcmd 34369 help
34369:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help
For more information about a specific command use 'help <command>'.
商用機能のロックを解除する
jcmdで商用機能のロックを解除できます。まずは商用機能のロックの状態を確認します。
$ jcmd 34369 VM.check_commercial_features
34369:
Commercial Features are locked.
「Commercial Features are locked.」とあるので、商用機能はロックされています。
次にJFRの状態も確認してみましょう。
$ jcmd 34369 JFR.check
34369:
Java Flight Recorder not enabled.
Use VM.unlock_commercial_features to enable.
「Java Flight Recorder not enabled」とあるので、有効化されていません。VM.unlock_commercial_features
を実行して有効化するようにという記述があります。
$ jcmd 34369 VM.unlock_commercial_features
34369:
Commercial Features now unlocked.
「Commercial Features now unlocked」となり、商用機能が解除されました。
では商用機能の状態を確認します。
$ jcmd 34369 VM.check_commercial_features
34369:
Commercial Features are unlocked.
Status of individual features:
Java Flight Recorder has not been used.
Resource Management is disabled.
「Java Flight Recorder has not been used」とあるので、有効にはなっているが利用していない状態になりました。
JFRを実行する
JFRの状態を確認できます。
$ jcmd 34369 JFR.check
34369:
No available recordings.
Use JFR.start to start a recording.
この指示の通り、JFR.start
しましょう。
$ jcmd 34369 JFR.start filename=sample.jfr duration=120s
34369:
Started recording 1. The result will be written to:
/Users/jyukutyo/gs-scheduling-tasks/complete/sample.jfr
状態を確認します。
$ jcmd 34369 JFR.check
34369:
Recording: recording=1 name="sample.jfr" duration=2m filename="sample.jfr" compress=false (running)
runningとあるので、JFRを実行していることがわかります。
今回はduration(期間)を2分にしたので、2分経過すると以下のようになります。
$ jcmd 34369 JFR.check
34369:
Recording: recording=1 name="sample.jfr" duration=2m filename="sample.jfr" compress=false (stopped)
stoppedと出力されています。
durationではなくdumponexit=true
を指定して、exitするときにdumpさせることもできます。
javaコマンドを実行したディレクトリにsample.jfr
があります。
JMCで開いてみましょう。
見れますね。
サマリー
アプリケーションの起動後にJFRを実行することで、トラブルシューティングなどさまざまな状況でJFRを使って収集した情報を元に判断をすることができます。ライセンスがあり利用できる環境であれば、ぜひ積極的に利用しましょう!