2022.11.18
OOMEの種類と分析
OOMEの種類と分析
(株)エクセムコンサルティング本部/APMチーム元ファンミン
概要
Maxgauge for Java支援をしてみると、OOME関連の問題によく接することになります。
OOMEはOut Of Memory Errorという言葉の通り、メモリが不足して発生したエラーで種類や原因は多様です。
そのため、OOMEの基本的な理解とパターン別の分析方法について学びます。
OOMEとは
java.lang.OutOfMemoryError は java.lang.VirtualMachineError の Subclass で JVM
Heap Memory に Object が割り当てられなくなったときに発生します。
OOMEの種類
OOMEエラーは、主に以下のように2つのエラーに区分されます。
▶ Java.lang.OutOfMemoryError : Java heap space
▶ Java.lang.OutOfMemoryError : PermGen space
Java.lang.OutOfMemoryError : Java heap space
Java.lang.OutOfMemoryError : java heap space は Java の Heap Memory スペースが不足している発生します。
スペース不足の原因としてはヒープメモリの大きさが小さくて発生する場合とApplication ロジックの問題で発生する場合があります。
Java.lang.OutOfMemoryError : java heap space を解決する最も簡単な方法としては – Xmx オプションを使って Heap Memory のサイズを増やす方法があります。 しかし、これはGC Timeの増加を伴うので、十分な事前テストが必要です。
Java.lang.OutOfMemoryError : java heap space を解決する2番目の方法としては、アプリケーションプロファイリングがあります。
OOMEが発生した時点で生成されたヒープダンプ分析に基づいて、無駄に多くのメモリを使用するか、メモリリークを引き起こすロジックを修正する必要があります。
Java.lang.OutOfMemoryError : PermGen space
Java Heap Memory 領域のうち Permanent 領域は String pool, Class Method に関連する各種
Meta Dataなどを保存する目的で使用されます。
したがって、JVM起動時にロードされるClassまたはStringの数が多いと、Java.lang.OutOfMemoryError:PermGen spaceの原因となります。
また、Classloader LeakによってOOMEが発生する可能性があります。
Java.lang.OutOfMemoryError : PermGen space を解決するための方法としては JVM Option チューニングがあります。
しかし、PermanentゾーンはHeapゾーンとは異なり、通常のビジネスプログラムでハンドリングできないため、JVM Optionのチューニングでも解決できない場合は、WASまたはJDKのバグを疑ってみるべきです。
VisualVM
VisualVM は、JDK 6 から提供されるツールで実行されている JVM に関する詳細情報を GUI で提供します。
そのため、既存の他のツールよりアクセシビリティが良いものになります。 提供される機能には、Thread モニタリング、JVM Memory モニタリング、Thread Dump および Heap Dump 生成などがあります。
Jmap
Jmap は JDK 5 から提供されるツールで Heap Dump を生成するときに使用され、VisualVM とは異なりコマンドラインベースのプログラムです。
Eclipse memory analyzer
Eclipse memory analyzer は省略して MAT と呼ばれ、Eclipse ベースの Heap memory 分析
ツールです。
MATはユーザーの便宜のためにヒープダンプを分析し、さまざまな図表にまとめて表示します。 IBMベースのHeap Dump分析はデフォルトでは提供されていませんが、Plug-Inをインストールすると分析可能です。
結論
OOME分析能力は、Maxgauge for JAVAエンジニアとして必須項目の1つです。 しかし、単にOOME別分析方法だけで円滑なOOME分析を行うことは、非常に困難です。。
OOME分析の基盤となるJava Heap Memory構造、GCオプション固有の特徴とログ分析、MAT使用スキルなどについての理解がなければ難関にぶつかります。
しかし、上記の内容に基づいて実際にサイトおよび社内テスト中に発生したヒープダンプ分析を進めてみると、OOME関連の課題にスムーズに対応できるMaxgauge for JAVAになることでしょう。.