1. ガベージコレクション(GC)があるJavaでなぜメモリリークが起きるのか?
GCは「ルート(GC Roots)から到達不可能なオブジェクト」を回収します。しかし、StaticなコレクションやThreadLocal、イベントリスナーの登録解除漏れがあると、不要なオブジェクトへの参照が残り続け、GCが回収できずにヒープを食いつぶします。
2. OOM発生時の自動ヒープダンプ設定
# 本番JVMオプションに必ず設定すべき必須フラグ
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/java/heapdump.hprof
3. Eclipse MAT(Memory Analyzer Tool)での分析手順
- Leak Suspects Report: MATが自動で巨大オブジェクトを検出し、リークの疑いがあるクラスを特定。
- Dominator Tree: どのオブジェクトがヒープの何%を保持(Retained Heap)しているかをソート表示。
- Path to GC Roots: 不要になったはずのオブジェクトを誰が握り続けているかを追跡し、コードのバグを修正。