この項では、トラブルシューティングの関連データを収集可能にするためのJVMオプションやフラグの設定について説明します。
収集するデータはシステムごとに異なり、問題が発生した場合に実際に使用するデータに依存します。問題が発生する前に、次のデータの収集を検討してください。
コア・ファイルを有効にする: たとえば、セグメンテーション・フォルトによってJavaがクラッシュした場合、OSはディスクにコア・ファイル(メモリーの完全なダンプ)を保存します。LinuxおよびSolarisでは、コア・ファイルがデフォルトで無効になっている場合があります。Linux/Solaris上のコア・ファイルを有効にするには、通常、アプリケーションを起動する前にコマンド行でulimit -c unlimited
コマンドを実行するだけで十分です(一部のシステムでは、これらの制限を処理する方法が異なる場合があります)。
注意: コア・ファイルは、特に大きなJavaヒープで実行する場合、多くのディスク領域を取ります。
コア・ファイルを有効にするかどうかを決定するときは、システムでクラッシュが発生した場合の対処方法を検討します。コア・ファイルを参照したいと思いますか。多くのJavaユーザーには、コア・ファイルは大して役に立ちません。ただし、クラッシュが発生した場合に、gdb
などのネイティブ・デバッガまたはServiceability Agentを使用してデバッグする場合は、アプリケーションを起動する前にコア・ファイルを有効にしてください。
多くの場合、クラッシュを再現するのは困難です。そのため、アプリケーションを起動する前にコア・ファイルを有効にします。Serviceability AgentのHSDBおよびCLHSDBツールの詳細は、Javaマガジンの記事を参照してください。
JVMフラグに-XX:+HeapDumpOnOutOfMemoryErrorを追加する: -XX:+HeapDumpOnOutOfMemoryError
フラグは、アプリケーションでOutOfMemoryError
が発生した場合に、ディスクにJavaヒープのダンプを保存します。jhatユーティリティ・ツールを使用してJavaヒープを検査し、多くの領域を使用しているオブジェクトを見つけ出し、使用されていないオブジェクトが維持されていないかチェックします。
ヒープ・ダンプは、特に大きなJavaヒープで実行する場合、コア・ファイルと同様に非常に大きくなる可能性があります。
再び、アプリケーションでOutOfMemoryError
が発生した場合の対処方法を考えます。エラーの発生時に、ヒープを検査したいと思いますか。その場合、アプリケーションで予想外のOutOfMemoryError
が発生したときにこのデータを取得するために、このフラグをデフォルトでオンにします。
Javaフライトの連続記録を実行する: Java Flight Recorder (JFR)は商用機能です。開発者のデスクトップ/ラップトップ上では無償で、また評価目的であればテスト環境、開発環境および本番環境で使用できます。ただし、JFRを本番サーバーで有効にする場合は、商用ライセンスが必要です。
連続フライト記録を実行するためにJavaを設定します。連続フライト記録は、JFRイベントの循環バッファです。アプリケーションで問題が発生した場合は、最後の1時間の実行からデータをダンプできます。JFRイベントは、メモリー・リーク、ネットワーク・エラー、高いCPU使用率、スレッドのブロックなど、幅広い問題のデバッグに非常に役立ちます。
連続フライト記録を使用した実行のオーバーヘッドは非常に低いです。Java連続フライト記録の作成の詳細は、「フライト記録の作成方法」を参照してください。
JVMコマンド行に-verbosegcを追加する: -verbosegc
フラグは、Javaガベージ・コレクタの基本情報をログします。このログは、次のことを見つけるのに役立ちます。
ガベージ・コレクションの実行に時間がかかっているかどうか。
空きメモリーが経時的に減少しているかどうか。
ガベージ・コレクタのログは、アプリケーションがOutOFMemoryError
をスローするか、パフォーマンスの問題が発生した場合、問題の診断に役立ちます。したがって、-verbosegc
フラグをデフォルトでオンにすると、問題のトラブルシューティングに役立ちます。
注意: アプリケーションの再起動によって前のログが削除されないように、ログ・ローテーションを使用します。JDK7以降では、UseGClogFileRotation
フラグおよびNumberOfGCLogFiles
フラグをログ・ローテーションの設定に使用できます。これらのフラグの詳細は、Java HotSpot VMのデバッグ・オプションを参照してください。
JavaバージョンおよびJVMフラグを出力する: Javaのバグを提出したりフォーラムのヘルプを検索する前に、ログ・ファイルの基本情報がすぐわかるようにしておきます。たとえば、Javaバージョンと使用しているJVMフラグを印刷すると役立ちます。
アプリケーションをスクリプトで起動する場合は、実行する前に、java -version
を実行してJavaバージョンを印刷し、コマンド行を印刷してください。または、JVMの引数に-XX+PrintCommandLineFlags
と-showversion
を追加することもできます。
リモート・モニタリングのためのJMC JMXの設定: JMXは、Mission ControlまたはVisual VMなどのツールを使用してJavaアプリケーションにリモート接続するために使用できます。アプリケーションを実行しているマシン上でこれらのツールを実行できる場合を除き、これを設定すると、後のアプリケーションのモニター、診断コマンドの送信、フライト記録の管理などに役立ちます。JMXの有効化にパフォーマンス上のオーバーヘッドはありません。
JMXテクノロジを使用してJVMをモニターする方法の手順を参照してください。
Javaアプリケーションの起動後にJMXを有効にするための別の方法としては、ManagementAgent.start
診断コマンドを使用します。コマンドで送信できるフラグの一覧については、jcmd <pid> help ManagementAgent.start
を実行してください。
jcmd
の詳細は、「jcmdユーティリティ」を参照してください。