FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

Java Flight Recorderを起動後に実行しよう

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>'.

JFRやGCVMといったものはドメインと呼ぶそうです。

商用機能のロックを解除する

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を使って収集した情報を元に判断をすることができます。ライセンスがあり利用できる環境であれば、ぜひ積極的に利用しましょう!