Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。
概要
前回からの続きです。
前回の記事ではJava Flight Recorder(JFR)のファイルとして、JDKに付属しているサンプルのものを使いました。
今回は、自分で起動したアプリケーションにJFRのファイルを出力させ、Java Mission Controlで内容を見ることにします。
対象アプリケーション
対象のアプリケーションには要件がとくにないので、起動しやすいSpring Bootアプリケーションにします。
https://spring.io/guides/gs/scheduling-tasks/
このアプリケーションは定期的に日時を出力するだけのアプリです。GitHubから取得できます。Gitクライアントがない場合はZIPファイルでダウンロードもできます。
$ git clone https://github.com/spring-guides/gs-scheduling-tasks.git
$ cd gs-scheduling-tasks/complete
$ ./gradlew build
Downloading https://services.gradle.org/distributions/gradle-2.3-bin.zip
...(中略)...
:compileJava
Download https://repo1.maven.org/maven2/org/slf4j/slf4j-parent/1.7.21/slf4j-parent-1.7.21.pom
:processResources UP-TO-DATE
:classes
:findMainClass
:jar
:bootRepackage
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
Total time: 48.63 secs
build/libs/gs-scheduling-tasks-0.1.0.jar
という実行可能JARファイルができます。
Java Flight Recorderの出力設定
以前の記事でJFRは以下のようなものだと記載しました。
「Java Flight Recorderは、Oracle JDKに組み込まれているプロファイリングとイベント収集フレームワークです。Javaの管理者および開発者は、Java Virtual Machine (JVM) とJavaアプリケーションがどのように動作しているかについての詳細な低レベル情報を収集することができます。」
http://www.oracle.com/technetwork/jp/java/javaseproducts/mission-control/index.html
JFRのガイドは以下のページにあります。
http://docs.oracle.com/javacomponents/jp/jmc-5-5/jfr-runtime-guide/toc.htm
JFRのファイルを出力するためには、javaコマンドに次のオプションを指定します。
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=sample.jfr main.Sample
-XX:+UnlockCommercialFeatures
オプションは、JFRと直接関係はありませんが、商用機能のロックを解除するものです。JFRを使うためには必要です。-XX:+FlightRecorder
オプションでJFRをオンにし、-XX:StartFlightRecording=duration=60s,filename=sample.jfr
で記録する期間と出力先のファイル名を指定します。この例の場合、収集する時間は60秒で、javaコマンドを実行したディレクトリにsample.jfr
というファイルを出力します。
なお、商用機能のロック解除は「Java SEのBCL(Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX)に定義されている開発用途での利用の場合」のみに限られていることに注意してください。
アプリケーションの起動
ではJFRを有効にしてSpring Bootアプリケーションを、JFRのオプションをつけて起動しましょう。
$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=120s,filename=sample.jfr -jar build/libs/gs-scheduling-tasks-0.1.0.jar
Started recording 1. The result will be written to:
/Users/jyukutyo/code/github/gs-scheduling-tasks/complete/sample.jfr
...(中略)...
Started recording 1. The result will be written to:
という出力があるので、JFRが起動してファイルに出力していることがわかります。今回は120秒を指定したので、2分経過したらアプリケーションを停止してもらって大丈夫です。sample.jfr
が出力されているか確認します。
$ ls -lat
total 552
-rw-r--r-- 1 jyukutyo staff 251447 6 17 16:11 sample.jfr
ありました。
Java Mission Controlで見てみよう
ではJava Mission Control(JMC)でsample.jfr
を開きます。
高負荷なアプリケーションではないので、たいしたデータはありませんが、見れています。
メモリーを見てみます。ガベージ・コレクションタブを開きます。
ガベージコレクションは起動時にしかなかったようです。フルGCはなくScavenge(New領域のGC)だけでした。次にGC構成のタブを開きます。
GCアルゴリズムもデフォルトのままですので、パラレルGCです。ヒープサイズは初期128MB、最大2GBです。こういったこともJFRを通じてわかります。
サマリー
やはりJFR、JMCはすごいですね!今回は起動時にJFRの収集を開始させましたが、次の機会には起動後のアプリケーションに対してJFRに収集させる方法について書きたいと思います。