第3章 パフォーマンス問題の分析
3.1. ガベッジコレクションロギングの有効化
Java のパフォーマンス問題、特にメモリー使用量に関連する問題をトラブルシューティングする場合、ガベッジコレクションのログを分析すると役立つことがあります。
ガベッジコレクションのロギングを有効にしても、ログファイルへの書き込みによって追加のディスク I/O アクティビティーが発生する以外に、サーバーのパフォーマンスに著しく影響することはありません。
ガベッジコレクションのロギングは、OpenJDK または Oracle JDK で実行しているスタンドアロン JBoss EAP サーバーではすでにデフォルトで有効になっています。JBoss EAP 管理対象ドメインの場合、ガベッジコレクションのロギングはホストコントローラー、プロセスコントローラー、または個別の JBoss EAP サーバーに対して有効にできます。
ご使用の JDK でガベッジコレクションのロギングを有効にするために正しい JVM オプションを使用してください。以下のオプションのパスはログを作成する場所に置き換えてください。
注記Red Hat カスタマーポータルでは、最適な JVM 設定の生成をお手伝いする JVM Options Configuration Tool を使用できます。
OpenJDK または Oracle JDK の場合
-verbose:gc -Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTimeIBM JDK の場合
-verbose:gc -Xverbosegclog:/path/to/gc.log
ガベッジコレクションの JVM オプションを JBoss EAP サーバーに適用します。
JVM オプションを適用する方法は、JBoss EAP『設定ガイド』(スタンドアロンサーバーへの適用 および 管理対象ドメインのサーバーへの適用) を参照してください。
3.2. Java ヒープダンプ
Java ヒープダンプは、特定時に作成された JVM ヒープのスナップショットです。ヒープダンプの作成および分析は、Java アプリケーションの問題の分析やトラブルシューティングに役立つことがあります。
JBoss EAP プロセスの Java ヒープダンプの作成および分析方法は、使用している JDK に応じて異なります。ここでは、Oracle JDK、OpenJDK、および IBM JDK での一般的な方法を取り上げます。
3.2.1. ヒープダンプの作成
3.2.1.1. OpenJDK および Oracle JDK
オンデマンドヒープダンプの作成
jcmd コマンドを使用すると、OpenJDK または Oracle JDK で実行している JBoss EAP のオンデマンドヒープダンプを作成できます。
- ヒープダンプを作成する JVM のプロセス ID を判断します。
以下のコマンドでヒープダンプを作成します。
$ jcmd JAVA_PID GC.heap_dump -all=true FILENAME.hprof
これにより、ヒープダンプファイルが HPROF 形式で作成され、通常
EAP_HOMEまたはEAP_HOME/binに保存されます。代わりに、別のディレクトリーへのファイルパスを指定することもできます。
OutOfMemoryError での自動的なヒープダンプの作成
-XX:+HeapDumpOnOutOfMemoryError JVM オプションを使用すると、OutOfMemoryError 例外の発生時に自動的にヒープダンプを作成することができます。
これにより、ヒープダンプファイルが HPROF 形式で作成され、通常 EAP_HOME または EAP_HOME/bin に格納されます。代わりに、-XX:HeapDumpPath=/path/ を使用してヒープダンプのカスタムパスを設定することもできます。-XX:HeapDumpPath=/path/filename.hprof のように -XX:HeapDumpPath を使用してファイル名を指定すると、ヒープダンプはお互いに上書きされます。
JVM オプションを適用する方法は、JBoss EAP『設定ガイド』(スタンドアロンサーバーへの適用 および 管理対象ドメインのサーバーへの適用) を参照してください。
3.2.1.2. IBM JDK
IBM JDK を使用している場合、ヒープダンプは OutOfMemoryError の発生時に自動的に生成されます。
IBM JDK のヒープダンプは、portable heap dump (PHD) 形式ファイルとして /tmp/ ディレクトリーに保存されます。
3.2.2. ヒープダンプの分析
ヒープダンプ分析ツール
ヒープダンプを解析し、問題の特定を手助けするツールは多く存在します。Red Hat は、HPROF または PHD 形式でフォーマットされたヒープダンプを解析できる Eclipse Memory Analyzer ツール (MAT) の使用を推奨します。
Eclipse MAT の使用に関する詳細は、Eclipse MAT のドキュメント を参照してください。
ヒープダンプ解析のヒント
ヒープパフォーマンスの問題の原因が明白であることもありますが、アプリケーションのコードや、OutOfMemoryError のような問題を引き起こす状況を理解する必要があることもあります。これにより、メモリーリークの問題であるかまたはヒープのサイズが小さすぎるのかを特定することができます。
メモリー使用率の問題特定に推奨される方法には以下が含まれます。
- メモリーを大量に消費している単一のオブジェクトが見つからない場合、クラスでグループ化して、多くの小さなオブジェクトが大量のメモリーを消費していないか確認します。
-
最もメモリーを使用しているのが 1 つのスレッドであるかを確認します。これには、
OutOfMemoryErrorによって引き起こされたヒープダンプが指定のXmx最大ヒープサイズよりも大幅に小さいかどうかを確認するとよいでしょう。 -
通常の最大ヒープサイズを一時的に 2 倍にすると、メモリーリークをより検出しやすくなります。
OutOfMemoryErrorの発生時、メモリーリークに関連するオブジェクトのサイズはヒープのサイズの約半分になります。
メモリー問題の原因を特定したら、ガベッジコレクションのルートからパスを確認し、オブジェクトが何によって維持されているかを確認します。
3.3. Java スレッドによる CPU 高使用率の特定
Red Hat Enterprise Linux または Solaris 上で JBoss EAP を使用している場合は、Red Hat カスタマーポータル上で JVMPeg ラボツールを利用すると、CPU の高使用率を特定するための Java スレッド情報の収集および分析が容易になります。以下の手順を使用する代わりに JVMPeg ラボツールの使用手順 に従います。
OpenJDK および Oracle JDK 環境では、jstack ユーティリティーを使用して Java スレッドの分析情報を取得できます。
CPU の使用率が高い Java プロセスのプロセス ID を特定します。
使用率が高いプロセスのスレッドごとの CPU データを取得すると便利なこともあります。このデータを取得するには、Red Hat Enterprise Linux システム上で
top -Hコマンドを使用します。jstackユーティリティーを使用して、Java プロセスのスタックダンプを作成します。Linux および Solaris の例を以下に示します。jstack -l JAVA_PROCESS_ID > high-cpu-tdump.out複数のダンプを周期的に作成し、一定期間での変更および傾向を確認する必要があることがあります。
- スタックダンプを分析します。Thread Dump Analyzer (TDA) などのツールを使用できます。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.