修复java内存泄漏的学习网站

修复java内存泄漏的学习网站,java,memory-leaks,visualvm,jhat,Java,Memory Leaks,Visualvm,Jhat,学习修复java内存泄漏的最佳场所是什么?我一直试图在网上找到好的资源,但令我失望的是,我发现正在讨论玩具的例子。我也能够解决小玩具转储的问题,但现实世界中的应用程序转储更具挑战性,并且提供很少的线索 我尝试过像Jhat、JMap、VisualVM和MAT这样的工具 了解修复Java内存泄漏的最佳途径是什么?建议一本书也是受欢迎的 提前感谢。您是否尝试搜索了?有很多。一个好的搜索引擎会对它们进行分类。内存泄漏有很多种,但在实践中,以下策略会给出很好的结果(免责声明:我正在显示屏幕截图,因为我的公

学习修复java内存泄漏的最佳场所是什么?我一直试图在网上找到好的资源,但令我失望的是,我发现正在讨论玩具的例子。我也能够解决小玩具转储的问题,但现实世界中的应用程序转储更具挑战性,并且提供很少的线索

我尝试过像Jhat、JMap、VisualVM和MAT这样的工具

了解修复Java内存泄漏的最佳途径是什么?建议一本书也是受欢迎的


提前感谢。

您是否尝试搜索了?有很多。一个好的搜索引擎会对它们进行分类。

内存泄漏有很多种,但在实践中,以下策略会给出很好的结果(免责声明:我正在显示屏幕截图,因为我的公司开发了它):

1。检查最大的对象

“最大的对象”保留了很多其他人无法保留的内存。在JProfiler中,可以在heap walker的“最大对象”视图中找到它们。这通常发生在缓存中

2。检查具有大量实例的类

有时,参考资料更为复杂,最大的物体无法提供线索。可以检查具有大量实例的类的传入引用。首先,查看累积引用有助于区分有效引用链和可疑引用链

此外,检查实例已分配到何处(而不是它们如何被引用)通常可以了解正在发生的事情

通常,这是一个多步骤的过程,选择参照链、分配点或根据对象的内容进行选择

3。搜索GC根目录的路径

如果这仍然不能提供线索,您可以选择单个对象并显示它们的引用链,这些引用链指向垃圾收集器根。这对你们中的很多人都很有帮助,在试图缩小可疑对象的范围之前,你们可以缩小可疑对象的范围,否则你们可能会有很多候选对象


关于这个话题也有很多建议。

我还没有尝试JProf。明天就是这一天:-)但是没有神奇的工具为你做事。。。它们都适用于特定的用例。如果可能的话,我建议你去瓦尔格林。这将归结为您知道如何使用该工具并理解输出:)我强烈建议您使用yourkit java profiler。这不是免费的,但它非常值得。如果你打开钱包,你甚至可能会为Chronon掏出一些钱,并继续重播泄密场景。感谢你的回答,里面有一点傲慢:-)。我确实浏览了很多网站(包括这一个)。我的问题是,现实世界的应用程序与这些主要讨论的玩具应用程序非常不同。真实世界的转储是完全关闭char[]和String对象,如何对数千个这样的对象进行排序和处理。其中大多数似乎都是有效的:-(是的,我是java转储新手。@Geek-你说得对,对不起。我今天喝了太多咖啡。你能粘贴你的示例转储,看看我们是否能提供更多帮助吗?@Geek,我建议你使用专业评测器的评估版本。我使用你的工具包,这有助于对大量数据进行排序并找到“热点”@AmirAfghani&Peter:谢谢你的回答。我有一个问题:我的大部分转储文件都是字符串和字符[]。有趣的是,有很多重复的字符串,但当我在VisualVM中创建GC路径时,通常会得到“找不到根”。你能解释一下吗。@Kegel:我的大部分转储文件都是字符串和字符[]。有趣的是,存在大量重复字符串,但当我在VisualVM中创建GC路径时,通常会得到“未找到根”:-(据我所知,这些对象应该被垃圾收集,但在堆中存在超过1天?@Geek堆中可能存在很长时间的非引用对象,这取决于它们未被引用时处于哪一代。另一种可能性是字符串是软引用或弱引用的,因此没有指向GC根的路径。JProfiler(默认情况下)在分析堆快照时删除弱引用对象,因为它们通常使分析变得更困难。很常见的情况是看到字符串及其内部字符[]在任何Java应用程序的堆的顶部。您可以在最大的对象列表中使用紧随其后的对象来试试运气