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 されなかった理由を突き止めようとしています。