Memory Leak

Memory Leakの概要

 

厳密に言えばJavaは、C / C ++の様な、Memory Leakは存在しません。少なくともJVMの規約(Specification)上、そのようになっています。 Javaでは、一度使用された後、使用されていないオブジェクト、すなわち、もはや参照(Reference)されていないオブジェクトは、Garbage Collectorによって自動的に整理されます。したがってMemory Leakが発生することがない。

 

JavaでのMemory Leakは、より正確に言えば、Unintentional Object Retention、すなわち[意図していないオブジェクトの継続保有]を意味します。オブジェクトを生成した後、参照関係を整理していない場合は、Garbage Collectorは、そのオブジェクトが使用される可能性があるかどうかを判断することができないため、メモリの解放処理を実行することができないのです。このような場合、オブジェクトが解除されずに継続常駐するJava Heapが不要なオブジェクトによりいっぱいになりOut Of Memory Errorが発生することになります。つまり、JavaでのMemory LeakはUnintentional Object RetentionによるOut Of Memory Errorの発生に要約することができます。 ç

パラメータと待機時間

 

Memory Leakがある場合には、メモリ空間が徐々に不必要なオブジェクトでいっぱいになり、必然的にOut Of Memory Errorが発生します。したがってOut Of Memory Errorが発生した場合、まず、メモリ空間の大きさを検証し、次にMemory Leakの発生の可能性を検討しなければなりません。

 

残念ながらMemory Leakが発生する場所を正確に見つけることは難しい場合が多いのがほとんどです。必要に応じてHProfと同じ基本的なProfilerやJProfiler、JProbeなどProfilerを介してメモリ分析を実行しなければなりません。

・参照リンク
  1.JProfiler
  2.JProbe

Memory Leakと性能

 

Memory LeakだけOOMEだけ起こすことはありません。Memory Leakが発生すると、Java Heap空間の空き容量がよく確保されないため、継続的なGarbage Collectionが発生します。不幸中の幸いとしてOOMEが発生しなくても、継続的なGCの操作によって性能が低下する事になります。したがってGC Dumpを分析する際にMemory Leakの発生の可能性があることを確認しなければなりません。

Memory Leak検証ツール

 

次のようなツールを介してMemory Leak現象を分析し、検証することができます。

1.GC Dump
2.HProf
3.HAT
4.HA
5.VisualVM