woo*_*ngs 7 java garbage-collection memory-leaks jhat jmap
我有一个java程序,它一直调用java.util.zip压缩/解压缩数据.它会在几秒钟内耗尽内存.我有一个内存转储,jmap我正在查看它jhat.
终结器摘要显示Total instances pending finalization: 0.如果我理解正确,我没有任何对象(1)有finalize()方法,(2)已经被GC标记,(3)等待最终确定.这似乎很好.
当我查看特定对象时,对该对象的唯一引用是a java.lang.ref.Finalizer.无论对象是否为GC,都会为每个具有finalize()方法的对象创建Finalizer对象.所以看起来没有什么能阻止这个Deflater对象被GC控制.
对象位于0x7f4aeb7a35d0
java.util.zip.Deflater@0x7f4aeb7a35d0的实例(51个字节)
对此对象的引用:
java.lang.ref.Finalizer@0x7f4aeb8607c8(64字节):字段指示对象
该程序暂停运行System.in.read().一段时间后内存使用量不会下降.
更新:
我应该说清楚.内存转储显示许多对象没有GC,但没有其他对象(Finalizer对象除外)引用它们.我试图找出他们为什么不是GC的.
你肯定你关闭了流并end在deflater上调用了吗?如果这是一个你已经尝试过的简单建议,我很抱歉,但是Deflater当没有立即调用时,有很多关于内存泄漏的抱怨end,例如:
根本原因显然是当涉及本机元素使用的内存时,收集器无法跟上应用程序.这也解释了您在分析时看到的行为:内存已准备好回收,但只是没有足够快地回收.
既然你写了你不Deflator直接使用,而是通过Apache Thrift,尝试确定该库中哪个方法负责结束deflator,并确保你调用该方法.