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

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

アプリケーションでJava Flight Recorderファイルを出力しよう

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に収集させる方法について書きたいと思います。