開発、テストから運用まで、あらゆるフェーズでシステムのトラブル解決に役立つJava SE 7の「Java Flight Recorder」──Oracle DBA & Developer Day 2013レポート

Oracle Java & Developers編集部
2013-12-11 17:10:00
  • このエントリーをはてなブックマークに追加

Java SE 7で利用できるシステム稼働情報記録ツール「Java Flight Recorder」と問題究明ツール「Java Mission Control」。これらは開発の現場でどう役立つのか? 事例を基に紹介する。

Hotspot VMにJRockit VMを統合。最良のJVMが多くの企業で利用可能に

 本サイト記事「システムの詳細な稼働情報を記録/可視化する『Java Flight Recorder』と『Java Mission Control』がJava SE 7のHotspot VMで利用可能に!」でも報じたように、これまでオラクルのJRockit JVMだけで利用することができたJava Flight RecorderおよびJava Mission Controlが、Java SE 7のHotspot JVMでも利用可能になった。これらのツールを使うことで、具体的にどのようなことができるのか? ここでは、2013年11月にオラクルが開催した技術者向けカンファレンス「Oracle DBA & Developer Day 2013」のセッション「Java Flight Recorder - "Project HotRockit"」で紹介された、Java Flight RecorderとJava Mission Controlの活用例を紹介する。

 現在、Java SEに関してオラクルが進めている注目プロジェクトの1つに「Project HotRockit」がある。これは、オラクルが提供している2つのJVM、Hotspot VMとJRockit VMの2つを統合するというものだ。その狙いは、さまざまなプラットフォームに対応し、利用者数の多いHotspot VMと、インテル・プロセッサを搭載したサーバ向けにミッション・クリティカル・システムの実行基盤として最適化されたJRockit VMの長所を融合することで、より優れたJVMを広く提供することにある。


日本オラクル Fusion Middleware事業統括本部 ビジネス推進本部 製品戦略部担当シニアマネジャーの新井庸介氏

 セッションで初めに登壇した日本オラクルの新井庸介氏(Fusion Middleware事業統括本部 ビジネス推進本部 製品戦略部担当シニアマネジャー)は、同プロジェクトの進捗状況を次のように説明した。

 「2011年7月にJava SE 7がリリースされた後、最初の大型アップデートとなるJava SE 7 update 4においてJRockit VMの一部の機能がHotspot VMに移植されましたが、これはまだプロトタイプの段階でした。その後、2013年9月にリリースしたJava SE 7 update 40で、Java Flight RecorderとJava Mission Controlが正式にHotspot VMに組み込まれました。最終的には、2014年前半にリリース予定のJava SE 8で統合が完了する予定です」

 Java Flight RecorderとJava Mission Controlは、Javaアプリケーションの開発/運用時における各種の課題を解決するために開発された機能だ。具体的には、OSやJVM、Javaアプリケーションの詳細な稼働情報をJava Flight Recorderでシステムに大きな負荷をかけずに記録し(Java Flight Recorder動作時のオーバーヘッドは5%以下)、その情報(フライト記録)をJava Mission Controlに読み込むことで、グラフィカルな画面を使って問題の分析が行える。この2つのツールを使えば、システム障害などのトラブル発生時における解析作業の負担を大きく軽減できるほか、継続して情報を取得することで再現性の低いエラーの原因を突き止めるといったことが可能になるのだ。

 なお、最新バージョンであるJava Flight Recorder/Java Mission Control 5.2では、メソッドのボトルネックの解析やJavaコードの最適化を支援する「Method Profiling」、ファイルI/OやソケットI/Oをグラフィカルに表示する「New and improved tabs」、Java Flight Recorderで記録する項目をGUI上でカスタマイズできる「Template Manager」といった機能が追加された。「すでにJava Flight RecorderとJava Mission Controlをお使いの皆様には、さらに使い勝手が良くなったとご評価いただけるアップデートだと自負しています」と新井氏は自信を覗かせた。

バッチ処理で生じた "異常な正常終了"の原因を究明


日本オラクルコンサルティングサービス統括 テクノロジーコンサルティング統括本部 テクニカルアーキテクト本部 ミドルウェアアーキテクト部 シニアコンサルタントの伊藤智博氏

 続いて登壇した日本オラクルの伊藤智博氏(日本オラクル コンサルティングサービス統括 テクノロジーコンサルティング統括本部 テクニカルアーキテクト本部 ミドルウェアアーキテクト部 シニアコンサルタント)は、実際にJava Flight Recorder/Java Mission Controlがどのような場面で役立つのかを具体的なシナリオに沿って紹介した。

 このシナリオでは、日々生成される売上明細ファイルをロギングしつつ集計し、1カ月間の集計結果をファイルとして出力する月次バッチ処理のためのアプリケーションの開発を想定。技術的な面では、マルチスレッド処理により高速化を図ること、サードパーティ製のライブラリと自社フレームワークを使用することが前提となっている。このアプリケーションのシングル・スレッドとマルチスレッドでの動作確認、机上でのチューニングで発生したトラブルなどに対して、Java Flight RecorderとJava Mission Controlを使って解決を図るという流れだ。

 まずシングル・スレッドでの動作確認は、正常終了して集計結果も正常だったが、Java Flight Recorderで記録したログに異常が見られた。そこで、Java Mission Controlを使ってログを読み込み、動作状況を確認してみると、実際にバッチ処理を行っているスレッド「pool-1-thread-1」においてJava Exceptionが継続して発生していることがわかった。

 このイベントの内容を詳しく見ると、File Not Found Exceptionが発生し、その原因として「書き込みの許可がない」というメッセージが表示されている。つまり、アクセス権限が正しく設定されていないためにログを書き込むことができなかったわけだ。

 さらに調査を進めると、サードパーティ製のロガーを使って自社フレームワーク内のラッパがログを書き込もうとしたが、アクセス権限がないためロガーは例外をthrowしていることが判明する。しかも、この例外について、フレームワーク内のcatch句では何も対処していないため、ログ書き込みが失敗しているのにもかかわらず、バッチ処理が正常終了したと判断していたのだ。そこで、最終的には例外をthrowするように修正し、例外発生時には適切な対応を行うようプログラムが修正された。

 「このケースでは、ログの書き込み権限がなかったことが原因でしたが、権限を付与するだけで解決を図った場合、『ログ書き込み失敗時にも正常終了と判断してしまう』という問題が解決されないまま、システムをリリースすることになってしまいます。

 一般に、この『権限がないのにもかかわらず、なぜ正常終了するのか』という問題にまで踏み込んで原因を究明するのは、簡単ではありません。しかし、Java Flight RecorderとJava Mission Controlを使えば、システムの挙動をドリルダウンして調べていくことで、こうした隠れた問題を見つけ、解決することができるのです」(伊藤氏)