猿问

如何查找Java内存泄漏

如何查找Java内存泄漏

如何在Java中发现内存泄漏(例如,使用Jhat)?我试着在Jhat中加载堆转储,以了解基本情况。但是,我不明白如何才能找到根引用(参考文献)或者不管它叫什么。基本上,我可以看出哈希表条目有几百兆字节([java.util.HashMap$Entry或类似的东西]),但是地图在整个地方都使用.有没有什么方法可以搜索大型地图,或者可能找到大型对象树的一般根?

[编辑]好吧,到目前为止,我已经读过答案了,但我只能说我是个卑鄙的混蛋(这意味着我更感兴趣的是学习如何使用Jhat而不是支付JProfiler的费用)。而且,Jhat总是可用的,因为它是JDK的一部分。当然,除非Jhat没有办法,只能用蛮力,但我不敢相信情况会是这样。

此外,我认为我无法实际修改(添加并运行足够长的时间让我注意到泄漏。


冉冉说
浏览 728回答 3
3回答

MM们

我使用以下方法查找Java中的内存泄漏。我已经成功地使用了jProfiler,但我相信任何具有绘图功能的专门工具(差异更容易以图形形式进行分析)都会工作。启动应用程序,直到它达到“稳定”状态,这时所有初始化都完成了,应用程序处于空闲状态。多次运行怀疑产生内存泄漏的操作,以允许发生任何与缓存、DB相关的初始化。运行GC并获取内存快照。再做一次手术。根据操作的复杂性和所处理数据的大小,操作可能需要运行几次至多次。运行GC并获取内存快照。对两个快照运行一个diff并进行分析。基本上,分析应该从最大的正面差异开始,比如,对象类型,并找出是什么导致这些额外的对象留在内存中。对于在多个线程中处理请求的Web应用程序,分析变得更加复杂,但是仍然适用一般的方法。我做了很多项目,特别是为了减少应用程序的内存占用,这种通用的方法,通过一些特定于应用程序的调整和技巧,总是工作得很好。
随时随地看视频慕课网APP

相关分类

Java
我要回答