Javaヒープに関する異常としてメモリ不足やメモリリークがあります。また、GCに関する異常としてFullGC多発や長時間GCがあります。JFR/JMCを使って、これらの異常の原因を調査する方法を説明します。
メモリ不足やメモリリークが発生している場合、GCが起きやすくなるため、まずGCの発生状況を調査します。
“FullGC多発と長時間GC”を参照して、FullGCの多発などアプリケーションの運用に影響する事象が発生している場合は、“メモリ不足・メモリリーク”の調査を実施します。
FullGC多発と長時間GC
FullGCの多発やGCの長時間化が発生すると、性能低下やOutOfMemoryErrorが発生することがあります。
““GarbageCollection”イベント”に、GCが発生した時刻やGCの種類が記録されます。
JMCで[アウトライン]タブの[ガベージ・コレクション]を選択し、GCに関する情報を調査します。
GC履歴が図示されたグラフを見て、GCの間隔やGCにかかった時間を調べます。
以下では、Javaヒープ使用率の増加に伴い、繰り返しGCが発生しています。
詳細なデータを確認する場合は、以下の手順で調査します。
[アウトライン]タブの[イベント・ブラウザ]を選択します。
表示された[イベント・ブラウザ]の[イベント・タイプ・ツリー]から、[Garbage Collection]を選択します。
詳細なGCの発生時刻や期間のデータを確認できます。
“メモリ不足・メモリリーク”の内容を参考に、Javaヒープをチューニングする、または不要なオブジェクトの解放漏れがないことを確認してください。
“GarbageCollection”イベントは、発生したGCの発生時刻や期間、発生理由などの情報を記録します。イベント設定ファイルの“enabled”プロパティが“true”の場合に有効になります。本製品で提供するイベント設定ファイルを使用する場合、デフォルトの設定で有効になっています。
“threshold”プロパティで、GCに費やした時間のしきい値を設定できます。しきい値以上の時間を費やしたGCだけが記録されます。
<event name="jdk.GarbageCollection"> <setting name="enabled" control="gc-enabled-normal">true</setting> <setting name="threshold">0 ms</setting> </event>
イベント設定ファイルの設定方法は、“イベント設定ファイル”を参照してください。
メモリ不足・メモリリーク
メモリ不足やメモリリークが発生すると、性能低下やOutOfMemoryErrorが発生することがあります。
““GCHeapSummary”イベント”に、Javaヒープに関するメモリの使用状況が記録されます。
JMCで[アウトライン]タブの[メモリー]を選択し、メモリの使用状況を調査します。
GC前後の使用中のJavaヒープサイズを確認し、メモリ不足やメモリリークが発生していないかを調べます。
Javaヒープの使用率が高い場合、Javaヒープサイズの最大値が小さいためにメモリが不足している可能性があります。
“7.6.1 Javaヒープおよびメタスペースのチューニング”を参照して、Javaヒープのチューニングをしてください。
また、上の例のように、GC後の使用中のJavaヒープサイズの増加が続く場合、メモリリークが発生している可能性があります。メモリリークが発生している場合、不要なオブジェクトが解放されていないことが考えられます。
どのオブジェクトがメモリを圧迫しているかを調べるためには、““OldObjectSample”イベント”を使用します。
““OldObjectSample”イベント”は、JavaヒープのOld世代領域のオブジェクトを記録します。
[アウトライン]タブの[イベント・ブラウザ]を選択し、表示された[イベント・ブラウザ]の[イベント・タイプ・ツリー]から、[Old Object Sample]を選択します。
オブジェクトが使用しているJavaヒープサイズ、オブジェクト名や、オブジェクトが配列の場合は要素数を見ることができます。以下の例では、要素数800のbyte配列がOld世代領域に複数残っていることがわかります。
これらの情報をもとに、使用済みオブジェクトの解放漏れが無いことを確認してください。
“GCHeapSummary”イベントは、GC発生前後にJavaヒープに割り当てられたサイズや使用中のサイズなどの情報を記録します。イベント設定ファイルの“enabled”プロパティが“true”の場合に有効になります。本製品で提供するイベント設定ファイルを使用する場合、デフォルトの設定で有効になっています。
<event name="jdk.GCHeapSummary"> <setting name="enabled" control="gc-enabled-normal">true</setting> </event>
メモリリークの可能性のあるオブジェクトの名前、オブジェクトを作成した時刻、スレッドやスタックトレースなどの情報を記録するイベントです。
初期設定ではスタックトレースを記録しません。イベント設定ファイルの“stackTrace”プロパティを“true”に変更すると、スタックトレースを記録します。
<event name="jdk.OldObjectSample"> <setting name="enabled" control="memory-leak-detection-enabled">true</setting> <setting name="stackTrace" control="memory-leak-detection-stack-trace">true</setting> <setting name="cutoff" control="memory-leak-detection-cutoff">0 ns</setting> </event>
イベント設定ファイルの設定方法は、“イベント設定ファイル”を参照してください。