Javaでなぜ問題が起きるのか 〜システムをきちんと運用するための基礎知識

第4回 Javaから情報を取得する方法を知る

この記事を読むのに必要な時間:およそ 2 分

問題を切り分けるためには,情報を取得しないといけません。実行中のJavaアプリケーションから情報を取得する方法はたくさんありますが,よく使われている方法として,ログ出力,JMXとMBean,ダンプの3つを紹介します。

図1 よく使われる情報の取得方法

図1 よく使われる情報の取得方法

情報を取得する方法として,ほかにも以下のようなものが存在します。

  • Javaの仕様に則った方法(JVMTI:Java Virtual Machine Tool Interfaceを使ってJava VMへ接続する,など)
  • JVMやAPサーバの実装に固有の機能を使う方法

しかし,一般的に使われる方法ではなかったり,必要最低限の情報を取得するには負荷が高すぎて実運用に耐えられなかったり,使用するミドルウェアに依存する機能であるため,本連載では取り扱いません。

ログを出力する

「どのような状況で,どのような処理を行ったか」をログとして出力することは,Javaに限らず,情報を取得する最も一般的な方法でしょう。ログは,アプリケーション,アプリケーションサーバ,Java VMごとにそれぞれが出力します。

一般的に,ログはレベルがあります。レベルがあることによって,出力したいログとしたくないログ,詳細に出力したいログなどを制御できます。レベルの定義はさまざまありますが,アプリケーションの場合は以下のレベルに分けることが多いです。

  • 情報
  • 警告
  • デバッグ
  • トレース

アプリケーション,APサーバ,Java VMのそれぞれの開発者は,どのレベルで,どのログを出力するかを考えながら開発します。実行時にすべてのログを出力すると膨大な量となるためです。

アプリケーション

アプリケーション開発者が出力したい情報を,ログとして出力します。標準出力や標準エラー出力へログを出力することはなく,ログを出力するライブラリか,Javaに含まれるロギングAPIをアプリケーション開発者が使用して,それらに含まれるログレベルごとに用意されたAPIを使用してログを出力します。

APサーバ

「処理の受付と終了のログ」「外部接続の開始と終了のログ」などを出力しますが,どのようなログを出力できるかはAPサーバごとに異なります。どのログを,どのレベルで出力するかは,APサーバの設定ファイルや設定画面で設定します。アプリケーションがアプリケーションサーバのログ機構を使用する場合にも,同様に設定します。

JVM

ガベージコレクション(GC)やクラスのロードなど,アプリケーションを動かすためにどのような処理をしたかを出力します。ログを出力するには,JVMの起動オプションを追加してJavaプロセスを起動します。たとえば,起動オプションとして-verbose:gcを追加すると,GCログを有効化します。一部の設定は,この後の紹介するJMXを使用しても設定できます。

JMXとMBean

「処理を受け付けた件数」「用意しているリソースの使用量」などは,一般的にJavaアプリケーションは外部から監視ツールで一元管理されます。そのような場合には,Java Management Extensions(JMX)とManaged Bean(MBean)を使用します。

図2 JMXとMBean

図2 JMXとMBean

以下の手順で,JMXとMBeanで情報を取得します。

  1. JMXを使用してJavaプロセスへアクセスできるように設定する
  2. JMXクライアントを使用して,MBeanサーバへ接続する
  3. MBeanの名前を指定することで,MBeanへアクセスする

MBeanは,情報の取得だけではなく,実装次第でログレベルを変更するなどの操作もできます。JMXクライアントはたくさんの製品やOSS があります。一般的に運用担当者はGUIのJMXクライアントを使用して常時監視するのではなく,10秒間隔など定期的にMBeanへアクセスして情報を取得して,CSVファイルやRDBMS などへ蓄積して異常があれば対処します。以下の例では GUI の JMX クライアントである JConsole を使用します。

1. JMXを使用して,Javaプロセスへアクセスできるように設定する

同一のOSの上で動いているJavaプロセス(ローカルJavaプロセス)へアクセスするには特に何もする必要はありませんが,リモートの場合は,JMXのリモート接続を有効化します。リモート接続の有効化は,JVMの起動オプションに以下を追加します。

追加する VMオプション

-Dcom.sun.management.jmxremote

ポート番号や認証の有無,暗号化の有無も,別途設定できます。

著者プロフィール

伊藤智博(いとうちひろ)

日本オラクル(株)コンサルタント。

テクノロジストとしてJavaに関わる製品の技術支援をおもに担当し,Java Day TokyoやJavaOne San Franciscoなどでの講演も行う。得意分野は,Java全般を対象としたトラブルシューティングとパフォーマンスチューニング。最近は,Javaコミュニティへの支援や,Oracle製品とOSSの間を埋めるツールの作成を趣味としている。

ブログ:http://chiroito.blogspot.jp/
Twitter:@chiroito

コメント

コメントの記入