JavaのFlight RecorderとJDK Mission Controlをつかってプロファイリングをしてみる

はじめに

自分は結構JVMの動きとか、GCとかそういうのに興味があるのですが、どう分析して良いのかさっぱりでした。そこで、今回はJavaのプロファイリングデータを収集するツールであるFlight Recorderととその分析ツールであるJDK Mission Controlに入門して、JavaのアプリのGCを見てみることをゴールとします。

Flight Recorder(FR)とJDK Mission Control(JMC)について

前述していますがJava動的なプロファイリングデータを収集するためのツールです。Java 8まではOracle の商用番JavaでのみのサポートとなっていまいたがOpenJDKに寄贈され、Java11からはフリーで利用することが可能となっています。FRで収集したプロファイル情報はMCを使って分析することが可能です。

FRとMCを使ってみる

環境

JMCとFRを動かす環境は以下のとおりです

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
....

$ java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1, mixed mode, sharing)

JMCのインストールと起動

JMCはOracle OpenJDKのサイトからダウンロードできます。(後から気がついたのですが、普通にJava11以降のOpenJDKにも同梱されているみたいですね。binディレクトリの配下にあるみたいです。)
ここから各環境に合わせたバイナリをダウンロードし、適当なところに配置してください(僕の場合は/opt配下に置きました)

$ wget https://download.java.net/java/GA/jmc7/14/jmc-7_linux-x64_bin.tar.gz

$ tar -zxvf jmc-7_linux-x64_bin.tar.gz

$ sudo mv jmc-7+14_linux-x64_bin /opt/

解答したなかにjmcという名前のバイナリがいるのでおもむろにそいつを実行してみると起動しました。

$ ./jmc

f:id:yuya_hirooka:20200315145141p:plain
JMC1

ようこそ画面が開きました。特に設定せずとも日本語化されていましたね。
画像にも書かれていますがJMCは以下の二つから構成されるようです。

  • JMXコンソール
  • Java Flight Recorder

JMXコンソール

実行中のJVMインスタンスのモニタリングツールです。このツールではメモリとCPUの仕様状況、GC、スレッド・アクティビティなどのライブデータが提供されます。また、JVMおよびJavaアプリケーションのMBeanのモニターおよび管理に使用できる完全な機能を持つJMX MBeanブラウザも含まれています。

Java Flight Recoder

HotSpot JVMの実行中のアプリケーションに関する詳細な記録を生成します。

JMCのコンソールをざっくり見てみる

ようこそページから「ここをクリックしてJDK Mission Controlの利用を開始します」をクリックすると以下のコンソールが画面が開きます。

f:id:yuya_hirooka:20200315152049p:plain
JMC2

コンソールは大きく以下の4つから構成されるようです。JVMブラウザに、現在実行しているアプリケーションとそのJVMが表示されるようです。
現在JVMブラウザーにはJMC自身が表示されています。

InteliJのプロファイルングを見てみる。

今回はアプリのサンプルとしてIntelliJを使います。IntelliJを起動すると、JVMブラウザーにに以下のようにIntelliJのアプリが起動していることがわかります。

f:id:yuya_hirooka:20200315160328p:plain
intelliJ

IntelliJに関係しそうなアプリがいくつか立ち上がっていますが、今回はこれらを理解することが目的では無いので、スルーします。
InteliJのエントリーポイントであろう、MainクラスのFRの記録をしてみます。以下のように展開していき、フライト・レコーダーの記録がありませんの部分をダブルクリックします。

f:id:yuya_hirooka:20200315160922p:plain
JCM4

そうすると以下のように記録の設定画面が現れます。

f:id:yuya_hirooka:20200315160729p:plain
JFR

とりあえず記録時間を10分にして実行してみます。記録時間10minと入力して終了ボタンを押します。
すると記録が始まるのでしばらく待ちます。この際に今回はIntteliJで特に操作は行いませんでした。

記録が終わるとJVMブラウザーの隣にあるアウトラインのタブタブからその結果をみることができます。その中でも今回はGCに注目したいと思います。

f:id:yuya_hirooka:20200315162536p:plain

使用されているヒープが周期的な動きをしているのが見て取れます。左上のGCの実行結果を見てもわかるように10分の間に何度かGCが走っているようです。

感想

JCMとFRの簡単な使い方をまとめました。今回は使い方をまとめただけですが、使いこなせるようになるとアプリケーションの問題解決に使えそうです。

参考資料