学习修复java内存泄漏的最佳位置是什么?我一直试图在NET上寻找好的资源,但令我失望的是,我发现正在讨论玩具示例。我也能够对小型玩具转储进行故障排除,但现实世界的应用程序转储更具挑战性,并且没有什么线索。
我尝试过像Jhat,JMap,VisualVM和MAT这样的工具。
学习修复Java内存泄漏的最佳位置是什么?也欢迎提出一本书的建议。
提前感谢。
答案 0 :(得分:2)
答案 1 :(得分:2)
有许多类型的内存泄漏,但在实践中,以下策略可以提供良好的结果(免责声明:我正在显示来自JProfiler的屏幕截图,因为我的公司正在开发它):
<强> 1。检查最大的对象
“最大的对象”保留了许多其他人没有掌握的内存。在JProfiler中,可以在堆walker的“Biggest objects”视图中找到它们。这通常发生在缓存中。
<强> 2。检查包含大量实例的类
有时,引用更复杂,最大的对象没有提供线索。可以检查具有大量实例的类的传入引用。首先,查看累积的引用,将有效的引用链与可疑的引用链分开是有帮助的。
此外,检查实例的分配位置(而不是引用它们的方式)通常可以让您了解正在发生的事情。
通常,这是一个多步骤的过程,选择参考链,分配点或根据对象的内容进行选择。
第3。搜索GC根的路径
如果仍然没有提供线索,您可以选择单个对象并显示导致垃圾收集器根目录的引用链。它帮助你们很多人在尝试之前缩小了一组可疑对象的范围,否则你可能会有很多候选人。
此主题还有一个screen cast。