Javaでデバッグしにくい3つの場面
Javaアプリケーションで構築されたシステムの障害や性能問題が発生した場合、大半はデバッガやプロファイラ、ミドルウェアやサードパーティが提供するツールを用いることで解析できてしまいます。
しかし、以下のような状況ではJavaの世界からのアプローチがしにくく、通常のデバッグノウハウが使えないことがあります。
- プロセス再起動が許されないシステムでの情報取得がしたいとき
- 本番環境でしか発生せず、テスト環境でデバッグできない問題の場合
- GC(ガベージ・コレクション)ログ(-Xloggcなど)のように、javaコマンド起動オプションを与えなければ取得できない情報が必要な場合
- ソース変更が許されない場合に、特定状況下の情報を取得したいとき
- ある特定のメソッドなどが実行された瞬間のスレッドダンプやスタックトレースなどが必要な場合
- ソースの変更ができない、環境の制約などでデバッガが使用できない場合など
- 問題個所がアプリケーションなのか、JREなのか、OSなのか不明なとき
- 通信やファイルシステムなど、プラットフォームと密接に関係する部分での処理遅延やフリーズなど
- CPU使用率や(ネイティブレベルの)メモリ使用量が上昇しているが、Javaレベルで怪しいところが見当たらない
このような場合、Linux上のJavaシステムでは「OpenJDK+SystemTap」で突破口が見出だせることがあります。本企画では、これらの組み合わせによるJavaアプリケーションの解析手法について、5つの使用例を交えながら説明します。
JDKのオープンソース実装「OpenJDK」とは
「OpenJDK」は、Java SE仕様に準拠した唯一のJDKオープンソース実装です。現在JDK 6/7/8の3つのメジャーバージョンがJava SEのリファレンス実装としてソースコートが公開されており、オラクルだけでなく、世界中の開発者によるバグ報告やパッチ提供が可能になっています。
現在、FedoraやUbuntuをはじめとした、多くのメジャーLinuxディストリビューションでは、「IcedTea」プロジェクトのパッチを組み込んだ実行バイナリなどがパッケージ提供されており、OracleJDKとの違いを意識することなく開発・利用できます。
2010年に開催されたJavaOne 2010の基調講演では、OpenJDKはJavaのリファレンス実装を担い、オラクルが今後もOpenJDKコミュニティをサポートしていくとの発表がありました。
カーネル空間を動的にトレース「SystemTap」とは
「SystemTap」は、Linuxカーネル2.6から導入された、カーネル空間を動的にトレースするソフトウェアです。現在ではFedoraやUbuntuを始めとした多くのLinuxディストリビューションで配布されています。
バージョン0.6よりユーザー空間の「プローブ」(計測)機能(詳細は、後述)が試験的に実装され始め、カーネル空間とユーザー空間の動作状況を一元的に確認可能になりました。詳細は、以下の記事もご覧ください。
OpenJDK+SystemTapでできる6つの鬼凄
Solaris版JDKでは、以前より「DTrace」を用いたデバッグがサポートされていました。
IcedTeaプロジェクトでは、DTrace向けの「Probe」(プローブ)をLinuxのSystemTap向けに移植したスクリプト群「Tapset」が提供されており、OpenJDKの特徴の1つになっています。
これらのスクリプト、およびSystemTap本来の機能より、以下の6つのことが実現可能になります。次ページから、具体的に見ていきます。
- 数多くの情報を簡単に、自由に選択できる
- JavaVM内部イベントの検知
- JavaVMよりも下のレベルの状況把握
- JNI関数の呼び出し状況の把握
- 動的なアタッチ
- SystemTapの「guru」でカーネルレベルの解析
Copyright © ITmedia, Inc. All Rights Reserved.