今年のJAX Londonにおいて、OracleのJavaプラットフォームグループに所属するOla Westin氏はJava Mission Control (JMC)とJava Flight Recorder (JFR)について発表を行なった。
JMCとJFR双方の概要に続き、Westin氏は観客に記録がどう生成・解析されるかを説明し、それからデモを行なった。この記事ではInfoQはWestin氏の発表を紹介する。
Java Mission Controlの概要
Java Mission Controlは(サーバの加工されていないビューを提供する)JMX consoleと(プロファイルとアプリケーションデータの診断を支援する)Java Flight Recorderの助けを借り、Java仮想マシン(Java VM)の動作の可視化を支援するGUIである。
JMC(jmcというコマンド)はJava開発キット(JDK)に同梱され、binディレクトリに配置されている。…onsoleLog ‥ebug
オプションを用いて追加のログを取得することができる。(DTrace、JMXコンソールなどのような)様々な実験的プラグインがJMCからダウンロードすることができる。
Java Flight Recorderの概要
Java Flight RecorderはJava VM同様Javaアプリケーションの振る舞いに関する情報を収集する。JFRはJava VM内部に構築され、実行時情報をユーザに提供する。JFRの動作はどんなJava VMの動作を邪魔することもなく、オーバヘッドも2%以下と最小限に留められている。
JFRは即時イベント、期間イベント、リクエスト可能イベントのような異なるイベントを持つ。即時イベントは(スレッドの開始のような)特定の一点の時刻に発生し、そのため最もオーバヘッドが少ない。これに対し、(ガーベジコレクションなどのような)期間イベントはしきい値に基づき、(メソッドプロファイルサンプルのような)リクエスト可能なイベントも同様に設定可能な周期を持つため、これらのイベントのオーバヘッドはばらつくであろう。
JFRのサンプリングプロファイラはセーフポイントとなるためのスレッドを必要とせず、全ての単一のメソッド呼び出しをロギングするわけではない(ホットメソッドを検知したときのみ)。この発表においては、Nativeコードを起動するスレッドのサンプリングが行われなかった。
二種類の記録が存在する。時間が固定された(プロファイル)記録と継続記録である。双方ともファイルにダンプされる。
記録を生成する
JFRを用いて記録を開始するために、JVMに下記のオプションを指定する必要がある。-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
Java8 update 40からは、JMCとjcmd
の選択肢のどちらを用いても実行時にJFR記録を生成することができるようになった。
下記の3つの図は、上に示した3つのオプションのそれぞれによりJFR記録がどう生成されるかを示したものである。
下図で示すようにリモートシステムにおいて記録することもできる。
記録を解析する
Westinの発表では全ての調査に入る前に正しい問いに回答することの重要性を強調した。彼は下記に示す"ホットメソッド"問題に焦点を当てたデモについて言及した。
ここで、"ホットメソッド"タブが選択されたとき、LinkedList.indexOf(Object)の処理が収集されたサンプル全体の97.35%を占めていることを確認できる。スタックを下がっていくと、O(n)を必要とするcontains(Object)メソッドがリンクリスト内にあることを発見できる。これを修正するために、Westin氏はLinkedListをHashSetに置き換えたコードに対して別のJFR記録を実行した。その結果は以下である。
次にWestin氏は更に2つのデモを見せた。1つはスレッドの競合で、もう1つはオートボクシングに伴うメモリの割り当てである。それから彼は将来の展望に関してまとめた。
Rate this Article
- Editor Review
- Chief Editor Action