java.util.zipデータを圧縮/解凍するために呼び出し続けるJavaプログラムがあります。数秒以内にメモリが不足します。でメモリ ダンプを取得しjmap、 で表示していjhatます。
ファイナライザの概要が表示されますTotal instances pending finalization: 0。私が正しく理解していれば、(1) finalize() メソッドを持っている、(2) GC によってマークされている、(3) ファイナライズを待っているオブジェクトはありません。これは良さそうです。
特定のオブジェクトを見ると、このオブジェクトへの唯一の参照はjava.lang.ref.Finalizer. Finalizer オブジェクトは、オブジェクトが GC されているかどうかに関係なく、finalize() メソッドを持つ各オブジェクトに対して作成されます。したがって、このDeflaterオブジェクトが GC されることを妨げているものは何もないように見えます。
0x7f4aeb7a35d0 のオブジェクト
java.util.zip.Deflater@0x7f4aeb7a35d0 のインスタンス (51 バイト)
このオブジェクトへの参照:
java.lang.ref.Finalizer@0x7f4aeb8607c8 (64 バイト) : フィールド参照先
プログラムは によって実行中に一時停止されSystem.in.read()ます。しばらくメモリ使用量が減りません。
アップデート:
私はそれを明確にする必要があります。メモリ ダンプは、多くのオブジェクトが GC されていないことを示していますが、他のオブジェクト (ファイナライザー オブジェクトを除く) はそれらを参照していませんでした。GC されなかった理由を突き止めようとしています。