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
ようこそ画面が開きました。特に設定せずとも日本語化されていましたね。
画像にも書かれていますがJMCは以下の二つから構成されるようです。
JMXコンソール
実行中のJVMインスタンスのモニタリングツールです。このツールではメモリとCPUの仕様状況、GC、スレッド・アクティビティなどのライブデータが提供されます。また、JVMおよびJavaアプリケーションのMBeanのモニターおよび管理に使用できる完全な機能を持つJMX MBeanブラウザも含まれています。
Java Flight Recoder
HotSpot JVMの実行中のアプリケーションに関する詳細な記録を生成します。
JMCのコンソールをざっくり見てみる
ようこそページから「ここをクリックしてJDK Mission Controlの利用を開始します
」をクリックすると以下のコンソールが画面が開きます。
コンソールは大きく以下の4つから構成されるようです。JVMブラウザに、現在実行しているアプリケーションとそのJVMが表示されるようです。
現在JVMブラウザーにはJMC自身が表示されています。
InteliJのプロファイルングを見てみる。
今回はアプリのサンプルとしてIntelliJを使います。IntelliJを起動すると、JVMブラウザーにに以下のようにIntelliJのアプリが起動していることがわかります。
IntelliJに関係しそうなアプリがいくつか立ち上がっていますが、今回はこれらを理解することが目的では無いので、スルーします。
InteliJのエントリーポイントであろう、MainクラスのFRの記録をしてみます。以下のように展開していき、フライト・レコーダーの記録がありません
の部分をダブルクリックします。
そうすると以下のように記録の設定画面が現れます。
とりあえず記録時間を10分にして実行してみます。記録時間
に10min
と入力して終了
ボタンを押します。
すると記録が始まるのでしばらく待ちます。この際に今回はIntteliJで特に操作は行いませんでした。
記録が終わるとJVMブラウザーの隣にあるアウトラインのタブタブからその結果をみることができます。その中でも今回はGCに注目したいと思います。
使用されているヒープが周期的な動きをしているのが見て取れます。左上のGCの実行結果を見てもわかるように10分の間に何度かGCが走っているようです。
感想
JCMとFRの簡単な使い方をまとめました。今回は使い方をまとめただけですが、使いこなせるようになるとアプリケーションの問題解決に使えそうです。