□OutOfMemoryについて
Javaで通常、OutOfMemoryというと、Java OOM(OutOfMemory)の事を指す。
これに対し、ネイティブ OOM(OutOfmemry)があり、OSからのヒープメモリを確保使用とした際、
それが不足すると、発生します。
これらを判別する方法は、Javaの標準出力にログが現れないものが、ネイティブOOMとなります。
Unix系OSでは、syslogログにOutOfMemoryの旨エラーログが出力されることがあります。
Java OOMが発生する場合、New+Old領域が不足した場合と、Permanent領域が不足した場合があります。
Permanentはクラスのメタデータ等の為確保される領域で、デフォルト16MB 最大64MBとなっている。
New+Old領域は、オブジェクトや、ハッシュデータなどが確保される領域で、New領域が、直ぐに解放
されるもの、Old領域は長期間メモリに確保されるものとなり、Old領域に確保されるとFullGCが発生
しない限り、不要となっても解放されない。メモリを確保しようとした時に、GCによっても必要な
ヒープメモリが確保できない時に、OOMが発生する。
New+Old領域が不足してOOMが発生する場合、単純に不足している場合と、メモリリークとメモリリーク
に似た現象の場合が考えれられます。メモリリークの場合は、参照オブジェクトをfinalなどで、nullを
アサインするなど、Jprobe等のプロファイラでも問題となりそうなコードを見つけることも出来ます。
最終更新:2006年09月20日 19:16