Glassfish 4.0のJSFの実装でメモリリークの可能性があったので、JVMの挙動を調査しようとJava Mission ControlとFlight Recorderを使ってみました。
Mission ControlとFlight Recorder、いずれも元々JRockitに搭載されていた機能ですが、HotSpot JVMにもマージされJava 7 Update 40からJDKに同梱されるようになってます。運用中のシステムで使用するには、Java SE AdvancedあるいはJava SE Suiteのライセンスが必要となります。
テスト、開発での使用についてはライセンスは不要のようで、VMのオプションに-XX:+UnlockCommercialFeaturesを指定すれば利用可能になります。
環境
- Glassfish 4.0
- Java 1.8.0_05-b13
Glassfishの設定
今回はGlassfishをプロファイルをしたかったので、Glassfishのserver-configのJVM設定でFlight RecorderとJava Mission Controlを使用するための以下のVMオプションを追加します。(反映のためGlassfishの再起動が必要です。)
- -XX:+UnlockCommercialFeatures
- -XX:+FlightRecorder
Java Mission Controlでプロファイリング
準備はこれだけであとはMission Controlを起動するだけ。Java 7 Update 40以降であればjmcコマンドが同梱されてるのでそのコマンド実行するとMission Controlが起動します。EclipseベースのUIで、左側のパネルのJVMブラウザというタブを開くと起動中のJVMのリストが表示されます。
今回プロファイリングしたいGlassfishを右クリックすると”フライト記録の開始”というメニューがあるので選択します。一定時間の記録か連続記録を選択し完了を押すとFlight Recorderによる記録が開始されます。一定時間の記録を選択した場合は設定した時間になると記録が終了しダンプが生成されます。
実際に記録した内容は以下のような形でMission Controlに表示されます。
全般
CPUの使用状況、ヒープの使用状況、GC一時休止時間などがビジュアライズされます。
メモリ
ヒープの使用状況、GCの回数・休止時間、参照オブジェクトの推移(弱参照、ソフト参照、最終参照、ファントム参照毎の)などがビジュアライズされます。
コード
時間を要したパッケージやクラス、メソッド、動的コンパイルされたメソッド等の情報がビジュアライズされます。
スレッド
ホットスレッド、競合によるロック時間、待機時間、スレッドダンプ等の情報がビジュアライズされます。
このような詳細なJVMの情報が、JVMのオプションを付けてMission Controlを操作するだけで簡単にプロファイリングできます。
運用環境などであればパフォーマンスボトルネックや障害分析に役立つ強力なツールだと思います。