JRockit JVMまたはJavaアプリケーションがクラッシュしていないのに応答しなくなった場合は、フリーズしていると考えられます。つまり、アプリケーションはリクエストに応答しませんが、プロセスはまだ存在しています。
この章では、JVMのフリーズの診断方法と、Oracleサポート担当者が問題を解決する場合に不可欠な情報の収集方法を説明します。
この章の内容は以下のとおりです。
システムはJVMまたはアプリケーションのどちらかでフリーズする可能性があります。フリーズがアプリケーションとJVMのどちらで起きているのかを確認するには、スレッド・ダンプの生成を試行します。
Windowsの場合、[Ctrl]+[Break]を押します。
LinuxおよびSolarisの場合、親JavaプロセスIDにSIGQUIT
(kill -3)
を送信します。
注意: すべてのプラットフォームで、jrcmd を使用してスレッド・ダンプを取得することもできます。例:
jrcmd nnnn "print_threads nativestack=true"
|
システムでJavaスレッド・ダンプの応答があった場合は、アプリケーションがフリーズしています。このタイプのフリーズのトラブルシューティングについては、7.2項「Javaアプリケーションのフリーズのトラブルシューティング」を参照してください。
スレッド・ダンプを取得できない場合は、JVMがフリーズしています。このタイプのフリーズのトラブルシューティングについては、7.3項「JVMのフリーズのトラブルシューティング」を参照してください。
スレッド・ダンプでロックとデッドロックについて(スレッド・ダンプの末尾近くを調べて)確認します。
フリーズの原因を特定できない場合、または問題を自力で簡単に解決できない場合は、アプリケーションの開発者に連絡します。
ユーザーと同様にアプリケーション開発者も問題を診断できない場合は、第9章「サポートに関するオラクルへの連絡」の説明に従ってOracleサポートにご連絡ください。Javaアプリケーションのフリーズに関するOracleサポートへのご連絡の際は、次の情報をご提供ください。
アプリケーションが正常に動作しているときのスレッド・ダンプを3つ
アプリケーションがフリーズしたときのスレッド・ダンプを3つ
アプリケーションが正常に動作しているときの120秒間のフライト・レコーダ記録を1つ
アプリケーションがフリーズしたときの120秒間のフライト・レコーダ記録を1つ
[Ctrl]+[Break]を使用する方法、または親JavaプロセスIDにSIGQUIT (kill -3)
を送信する方法を何度か試みてもスレッド・ダンプを取得できない場合、JVMはシグナルの処理を停止してフリーズしています。
このような場合は、JVMを強制的にクラッシュさせてからOracleサポートにご連絡ください。クラッシュ・ファイルは、Oracleサポート担当者が問題を診断および解決する場合に不可欠です。
この項では、フリーズしたJRockit JVMを強制的にクラッシュする方法について説明します。内容は次のとおりです。
LinuxシステムでフリーズしたJRockit JVMを強制的にクラッシュするには、SIGABRTシグナルを送信します。これによってプロセスが中断されてクラッシュが発生し、結果としてクラッシュ・ファイルが作成されます。
SIGABRT
を呼び出すには次の手順を実行します。
JRockit JVMプロセスのプロセスIDを見つけるには、次のコマンドを実行します。
注意: 下記の手順はカーネル2.6ベースのLinuxシステムおよびRed Hat Enterprise Linux 3.0(またはそれ以降のバージョン)で有効です。 |
pstree -p user | grep java
このコマンドで、user
はJRockit JVMプロセスの実行に使用されるLinuxのユーザー名です(例: webadmin
)。
コマンドによって大量の出力が生じる場合は、まずunset LANG
を実行することでLANG
環境変数のunset
を試行します。
コマンドでJavaプロセスが1つだけ表示される場合は、ステップ2に進みます。
コマンドによって複数のプロセスが表示される場合は、次のコマンドを実行して、必要なプロセスのコマンドライン・パラメータを出力します。
cat /proc/nnnn/cmdline | xargs --null -n1 echo
このコマンドで、nnnn
はJRockit JVMプロセスのIDです。
このコマンドでは、指定したJVMプロセスのコマンドライン・オプションが表示されます。いずれかのコマンドライン・オプションが問題の原因ではないかチェックします。
プロセスのバイナリ・クラッシュ・ファイル(.core
)が作成されるディレクトリを見つけるには、次のコマンドを入力します。
ls -l /proc/nnnn/cwd
このコマンドで、nnnn
はJRockit JVMプロセスのIDです。
バイナリ・クラッシュ・ファイルを作成(およびプロセスを終了)するには、次のコマンドを実行します。
ulimit -c unlimited
kill -SIGABRT nnnn
このコマンドで、nnnn
はJRockit JVMプロセスのIDです。
WindowsシステムでフリーズしたJRockit JVMを強制的にクラッシュするには、windbg
コマンドを次のように使用します。
windbg.exe -Q -pd -p nnnn -c ".dump /u /ma hung.mdmp; q"
このコマンドで、nnnn
はJRockit JVMプロセスのIDです。
注意: windbg は以下のURLからダウンロード可能なWindows用デバッグ・ツール・パッケージに含まれています。
|
JRockit JVMをサービスとして起動した場合は、次のいずれかの方法でスレッド・ダンプを収集できます。
自分のマシンから情報を収集する場合は、print_threads
診断コマンドとともにjrcmd
を実行します。
jrcmd
コマンドの詳細は、Oracle JRockit JDKツールを参照してください。
別のマシンから情報を収集する場合は、diagnostics
BeanとともにOracle JRockit Mission Controlを使用します。詳細は、Oracle JRockit Mission Controlオンライン・ヘルプを参照してください。
JRockit JVMをOracle WebLogic Serverで実行している場合は、beasvc –dump
を使用してJVMからスレッド・ダンプを取得します。
詳細は、Oracle WebLogic Server のドキュメントを参照してください。
サーバー・インスタンスがstdout
とstderr
に書き込むメッセージ(スタック・トレースとスレッド・ダンプを含む)を参照するには、stdout
とstderr
をファイルにリダイレクトします。Oracle WebLogic Serverのドキュメントを参照してください。
WebLogic Serverインスタンスからstdout
にスレッド・ダンプを書き込むには、次のいずれかの操作を行います。
weblogic.Admin THREAD_DUMP
コマンドを使用します。
コマンド・プロンプトに次のコマンドを入力します。
WL_HOME\bin\beasvc -dump -svcname:service-name
このコマンドで、WL_HOME
はWebLogic Serverのインストール先のディレクトリです。service-name
はサーバー・インスタンスを実行しているWindowsサービスです。例:
D:\Oracle\Middleware\wlserver_10.3\server\bin\beasvc -dump -svcname:mydomain_myserver