2012-10-31 51 views
1

我使用jprofiler为我的客户端代码检测内存泄漏。启动java.util.hashmap $ entry所使用的内存急剧增加至1700KB。之后它也下降了。堆转储显示java.lang.ref.finalizer正在使用最大的内存。它的结论是什么?当我尝试在我的源代码中查找finalize()时,它不在那里。在HTML文件finalize()中使用像这样。 finalize,这是什么意思?原因是finalize()或引用hashmap $条目导致泄漏?java中的内存泄露

+0

有没有这样的事情'java.lang.ref.finalizer'或'$的java.util.HashMap entry'。请使用REAL类名称或方法名称或任何它们更新问题。 –

+0

你为什么认为有内存泄漏?你的应用程序是否给你一个'OutOfMemoryException'?也许你只需要改变启动应用程序的内存量。 – radimpe

回答

2

如果你想查找内存泄漏,你应该看看完整的GC后使用了多少内存,如果你有很多finalisable引用,则要两次,否则你很可能会看到很多临时对象,没关系。

我怀疑你看到的数据类型都不是问题,尤其是如果他们定期使用它们。寻找消费只会增加。

+0

谢谢彼得。事实上,几乎每个数据数据类型的内存消耗值都在增加。我的意思是说,如果10分钟后消耗现在为50kb,则为56kb,执行gc后消耗为53kb意味着10分钟后3kb内存增加,并且周期性地仅以这种方式增加。它确认我的应用程序有内存泄漏吗? –

+0

完整GC后许多MB增加可能是泄漏。我不担心几KB,因为它可能是“噪音”。如果一切都在增加,则指向一个共同的因素,例如一个持有所有这些增长阶层的集合。 –

+0

非常感谢彼得。 –

0

它是什么结论?

首先,你所谓的“证据”是乱码,不清楚什么是不应该的。然而,基于一些猜测...我可以看到没有任何明显的内存泄漏迹象。

相反,它看起来如果你有一个大WeakHashMap,要么成为不可达,或者说得到了清理掉,因为GC注意到堆是越来越太饱会发生什么。

然而,我猜测可能是错误的,而且有可能在这里泄漏...

原因是敲定()或参考的HashMap $项导致泄漏?

也不一定。 (事实上​​,如果确实是一个存储泄漏的话,那是不可能,要么这些是直接原因。)

+0

谢谢斯蒂芬。事实上,几乎每个数据数据类型的内存消耗值都在增加。我的意思是说,如果10分钟后消耗现在为50kb,则为56kb,执行gc后消耗为53kb意味着10分钟后3kb内存增加,并且周期性地仅以这种方式增加。它确认我的应用程序有内存泄漏吗? –

+0

单个数据点不是内存泄漏的证据。一致的长期趋势将是泄漏的证据。 –