2

我是 Java 的初学者,想知道如何在 NetBeans 中分析这个内存配置文件会话以及如何观察它以帮助搜索内存泄漏?

什么是“实时字节”?我可以看到,当我对所有活动字节求和时,我只会得到 Java 应用程序系统内存使用的一小部分。为什么没有关于每种对象类型的分配字节的信息?“分配的对象”的价值不断增长是内存泄漏的迹象吗?

这是具有大量并发线程和 http 连接的应用程序。我检查了线程并且它们工作正常 - 我的意思是同时不超过 20 个线程。我使用 JBOSS Netty 进行 http 连接,使用 jSoup 来解析 HTML。

netbeans 分析器

这种内存泄漏是由太多分配的 ParseError 对象引起的吗?或者我应该使用字节创建堆栈跟踪来搜索内存泄漏?

其他资源:

netbeans 分析器

netbeans 分析器

编辑:

我已将 HTML Cleaner 添加到我的项目中。这导致我不再看到任何解析器错误。内存泄漏增长现在慢了大约 3-4 倍。在达到 800MB 的内存使用后,应用程序崩溃了,我可以在 NetBeans 中查看堆。结果:

堆

注意:我没有在我的应用程序中创建任何 LinkedHashMap,所以它必须由其他库创建。TagNode 是一个在“HTML Cleaner”清理后保存清理过的 html 的对象。我的应用程序中只有一个 TagNode 对象,它是 netty http 响应处理程序中的局部变量(由 messageReceived 调用)。

4

2 回答 2

2

我一直更喜欢Eclipse 的 MAT 工具,而不是 Netbeans 的内置诊断工具。MAT 也可以处理比 Netbeans 更大的堆转储。

最简单的方法是让 jvm 在 OOM 上吐出 heapdump,将其输入 MAT,并根据泄漏嫌疑人列表追溯内存泄漏的可能原因。

-XX:+HeapDumpOnOutOfMemoryError

是您需要的 JVM 选项。另一种方法是在应用程序 OOM 之前定期生成一些堆转储,并在 MAT 中比较这些堆转储 - 它具有比较转储的功能。请参阅此处以了解如何生成转储。有时需要检查堆元素的内容以找出它们来自何处。

这并不容易,并且需要一些时间来学习如何放大堆转储中的罪魁祸首,但这是一项非常有用的技能。

于 2011-08-12T23:08:08.037 回答
0

你似乎有很多 char[] 对象。我发现我的大部分内存泄漏都来自错误构造的循环,它们的迭代次数超过了应有的次数。这会创建大量对象,从而导致内存泄漏。

活动字节只是活动对象占用的字节总数。

有很多char[]活动字节正在使用中。我对此表示怀疑,因为这可能是发生内存泄漏的原因。

您最好创建断点并逐步执行,以准确查看内存泄漏发生在哪一行。

一个很好的阅读位置是在 NetBeans IDE 中分析 Java 应用程序简介。应该能够帮助您了解如何在 NetBeans 中进行调试。

希望这可以帮助。

于 2011-08-12T21:16:37.483 回答