診断ガイド

     前  次    目次     
コンテンツの開始位置

Oracle JRockit JVM がフリーズする

Oracle JRockit JVM または Java アプリケーションがクラッシュしていないのに応答しなくなった場合は、フリーズしていると考えられます。システムのフリーズが発生するのは、アプリケーションが要求に応答しなくなり、プロセスがまだ存在している場合です。システムのフリーズは、JVM またはアプリケーションのどちらかで起きる可能性があります。最初にすべきことは、フリーズがどこで起きているかを確認することです。

ほとんどの場合、JVM のフリーズを解決するには Oracle JRockit サポートに連絡する必要があります。この節では、システムのフリーズがどこで起きているかを診断する方法と、サポート チームによる問題解決に役立つ情報を収集する方法について説明します。

この節の内容は以下のとおりです。

 


フリーズの場所の診断

フリーズがアプリケーションと JVM のどちらで起きているのかを確認するには、以下のいずれかを実行してスレッド ダンプを生成してみます。

すべてのプラットフォームで、jrcmd を使ってスレッド ダンプを取得することもできます。次に例を示します。

jrcmd nnnn "print_threads nativestack=true"

nnnn は Java プロセスの PID です。マシンで実行されているすべての Java プロセスについて PID のリストを取得するには、コマンドライン パラメータを指定せずに jrcmd を実行します。

これらの手順の結果から、次のようにフリーズがどこで起きているかがわかります。

 


Java アプリケーションのフリーズ

アプリケーションのフリーズは、Java アプリケーションの何かが原因でシステムが応答しなくなった場合に発生します。ここでは、Java アプリケーションのフリーズに対処する方法について説明します。内容は以下のとおりです。

Java アプリケーションのフリーズの解決

Java アプリケーションのフリーズに対処するには、次の 2 つの方法があります。

問題が解決しない場合

これらの方法で対処しても問題が解決しない場合は、「Oracle サポートへのトラブル レポートの送付」に記載されている手順に従って Oracle サポートに問題を報告します。Java アプリケーションのフリーズに関するトラブル レポートを作成するときは、以下の情報を添付してください。

 


JVM のフリーズ

Ctrl-Break を使用する方法、または親 Java プロセス PID に SIGQUIT (kill -3) を送信する方法を何度か試みてもスレッド ダンプを取得できない場合は、JVM がシグナルの処理を停止しており、本当にフリーズしています。このような場合は Oracle サポートに連絡し、連携して問題の解決に当たる必要があります。ここでは、JRockit JVM を強制的にクラッシュさせて、必要なクラッシュ ファイルを作成する方法について説明します。内容は以下のとおりです。

JVM のフリーズに関する情報の収集

JVM のフリーズを解決するには、Oracle サポートに連絡する必要があるので、JVM がフリーズしたときに実行されていたプロセスの状態について、できるだけ多くの情報を集めてください。通常、この情報はクラッシュ ファイルに書き込まれますが、JRockit JVM が技術的にはクラッシュしていないため、JVM を強制的にクラッシュさせない限りファイルは作成されません。この節では、ご使用の JVM デプロイメントに応じて必要な状態情報を収集する方法について説明します。

Linux システムで情報を収集する

Linux で実行されている JRockit JVM の情報を収集するには、次のいずれかの方法を使用します。

診断の enableforce_crash コマンドを使って強制的にクラッシュさせる

R25 以降のバージョンの JRockit JVM では、enableforce_crash コマンドを使って JRockit JVM を強制的にクラッシュさせることができます。それにより、必要な状態情報を含むクラッシュ ファイルが作成されます。コマンド ラインに次のオプションを指定し、jrcmd を使用して強制的にクラッシュさせます。

-Djrockit.ctrlbreak.enableforce_crash=true
SIGABRT を使用する (最新の Linux システム)

SIGABRT は、プロセスに送信されたシグナルを中止させてクラッシュを引き起こします。それにより、クラッシュ ファイルが作成されます。以下のような方法で SIGABRT を呼び出します。

  1. 以下の手順に従って、JRockit JVM プロセスの PID を見つけます。
  2. 注意 : 以下の手順はカーネル 2.6 ベースの Linux システムおよび Red Hat Enterprise Linux 3.0 で有効です。
    1. JRockit JVM プロセスが Linux ユーザ webadmin として実行されていると仮定した場合、次のコマンドを入力します。
    2. pstree -p webadmin | grep java
    3. pstree によって不要な情報が大量に表示される場合は、先に LANG 環境変数の設定を解除してみます。
    4. unset LANG
    5. pstree によって Java プロセスが 1 つだけ表示されれば、それが求めている情報です。手順 2 に進みます。
    6. pstree によって複数のプロセスが表示される場合は、次のように入力してプロセスのコマンドライン パラメータを出力します。
    7. cat /proc/nnnn/cmdline | xargs --null -n1 echo

      (nnnn は、パラメータを調べるプロセスの PID です。たとえば 1234 のように入力します。)

  3. 次のコマンドを実行します。
  4. ls -l /proc/1234/cwd

    これにより、core ファイル (コア ダンプ クラッシュ ファイル) が作成される場所がわかります (PID を 1234 と仮定した場合)。

  5. 次のコマンドを入力して、コア ファイルを作成します (プロセスを終了します)。
  6. ulimit -c unlimited
    kill -SIGABRT 1234

    (やはり PID を 1234 と仮定した場合)

Windows システムで情報を収集する

Windows で実行されている JRockit JVM の情報を収集するには、次のいずれかの方法を使用します。

診断の enableforce_crash コマンドを使って強制的にクラッシュさせる

R25 以降のバージョンの JRockit JVM では、診断の enableforce_crash コマンドを使って JRockit JVM を強制的にクラッシュさせることができます。それにより、必要な状態情報を含むクラッシュ ファイルが作成されます。コマンド ラインに次のオプションを指定し、jrcmd を使用して強制的にクラッシュさせます。

-Djrockit.ctrlbreak.enableforce_crash=true
windbg を使用する

windbg コマンドを使用して、必要なコア ファイルを作成することもできます。次のコマンドを入力します。

windbg.exe -Q -pd -p nnnn -c ".dump /u /ma hung.mdmp; q"

(nnnn は PID です)

注意 : windbg は以下の URL からダウンロード可能な Windows 用デバッグ ツール パッケージに含まれています。
注意 : http://www.microsoft.com/whdc/devtools/debugging/default.mspx

JRockit JVM をサービスとして実行している場合の状態情報を収集する

JRockit JVM をサービスとして起動した場合は、次のいずれかの方法でスレッド ダンプを収集できます。

Oracle JRockit サポートへの情報の送付

Oracle サポートに連絡してください。Oracle サポートでは、JVM のフリーズの問題が解決するまで原因の調査を続けます。収集したすべてのスレッド ダンプを含めて、フリーズに関係するあらゆる情報を送付してください。Oracle サポートへの連絡方法については、「Oracle サポートへのトラブル レポートの送付」を参照してください。

 


応答しない NFS 共有

注意 : この情報は Linux ユーザのみを対象とします。

場合によっては、Network File System (NFS) の問題が原因でフリーズが発生することがあります。NFS は、複数の Linux コンピュータがネットワークを介してディスクを共有するために使用するプロトコルです。「NFS 共有」は、NFS で他のコンピュータから共有されるように設定されたディスクです。NFS 共有を持つマシンを使用している場合は (/etc/fstabnfs を探します)、応答しない NFS 共有のデータにアクセスしようとして、Java アプリケーションがフリーズしている可能性があります。この場合、デフォルトの動作では、ファイル アクセスを実行しているスレッドは NFS サーバが回復するまでいかなるシグナルにも応答しません。このため、Oracle JRockit JVM はスレッドを中断することができず、NFS サービスが回復するまでスレッドを中断しようとしてフリーズします。

NFS の問題が発生している場合は、NFS サーバが正しくコンフィグレーションされていることを確認してください。


  ページの先頭       前  次