我有一个Java程序,它不断调用
最终器总结显示
当我查看特定对象时,对该对象的唯一引用是一个
更新:
我应该澄清一下。内存转储文件显示许多对象未被GC,但没有其他对象(除Finalizer对象外)引用它们。我正在试图找出它们为什么没有被GC。
java.util.zip
来压缩/解压数据。它在几秒钟内就会用完内存。我使用jmap
生成了一个内存转储文件,并使用jhat
查看它。最终器总结显示
待终结的实例总数:0
。如果我理解正确,我没有任何对象符合以下条件:(1)具有finalize()方法,(2)被GC标记,(3)正在等待终结。这看起来很好。当我查看特定对象时,对该对象的唯一引用是一个
java.lang.ref.Finalizer
。对于每个具有finalize()方法的对象,都将创建一个Finalizer对象,无论该对象是否被GC。因此,似乎没有任何东西阻止这个Deflater
对象被GC。
该程序在运行时通过位于 0x7f4aeb7a35d0 的对象
java.util.zip.Deflater@0x7f4aeb7a35d0 的实例(51字节)
对此对象的引用:
java.lang.ref.Finalizer@0x7f4aeb8607c8(64字节):字段referent
System.in.read()
暂停。内存使用量在一段时间后不会下降。更新:
我应该澄清一下。内存转储文件显示许多对象未被GC,但没有其他对象(除Finalizer对象外)引用它们。我正在试图找出它们为什么没有被GC。