我有一个 java 程序,它不断调用java.util.zip
压缩/解压缩数据。它会在几秒钟内耗尽内存。我有一个内存转储,jmap
我正在查看它jhat
。
终结器摘要显示Total instances pending finalization: 0
。如果我理解正确,我没有任何对象 (1) 具有 finalize() 方法,(2) 已被 GC 标记并且 (3) 正在等待最终确定。这似乎很好。
当我查看特定对象时,对该对象的唯一引用是java.lang.ref.Finalizer
. Finalizer 对象是为每个具有 finalize() 方法的对象创建的,无论该对象是否被 GC 处理。所以看起来没有什么能阻止这个Deflater
对象被 GC 处理。
0x7f4aeb7a35d0 处的对象
java.util.zip.Deflater@0x7f4aeb7a35d0 的实例(51 字节)
对该对象的引用:
java.lang.ref.Finalizer@0x7f4aeb8607c8 (64 bytes) : 字段引用
程序在运行中被 暂停System.in.read()
。一段时间后内存使用量不会下降。
更新:
我应该说清楚。内存转储显示许多对象没有经过 GC,但没有其他对象(终结器对象除外)引用它们。我试图找出为什么他们没有被 GC'ed。