我是Java的初学者,想知道如何在NetBeans中分析这个内存配置文件会话以及如何观察它以获得帮助来搜索内存泄漏?
什么意思是“实时字节”?我可以看到,当我总结所有实时字节时,我将只获得java应用程序系统内存使用的一小部分。 为什么没有关于每种对象类型的已分配字节的信息? 是否不断增加“分配对象”内存泄漏的标志?
这是具有大量并发线程和http连接的应用程序。 我已经检查了线程并且它们正常工作 - 我的意思是同时存在不超过20个线程。 我使用JBOSS Netty进行http连接,使用jSoup进行HTML解析。
是否由分配的ParseError对象过多导致内存泄漏?或者我应该通过字节创建堆栈跟踪来搜索内存泄漏的原因?
其他资源:
修改
我已将HTML Cleaner添加到我的项目中。这导致我再也看不到任何解析器错误。内存泄漏现在增长约3-4倍。在达到800MB的内存使用量后,应用程序崩溃,我可以在NetBeans中查看堆。结果:
注意:我没有在我的应用中创建任何LinkedHashMap,因此必须由其他库创建。 TagNode是一个在“HTML Cleaner”清理后保存已清理的html的对象。我的应用程序中只有一个TagNode对象,它是netty http响应处理程序中的局部变量(由messageReceived调用)。
答案 0 :(得分:2)
我总是首选Eclipse's MAT tool给Netbeans的内置诊断设施。 MAT也可以使用比Netbeans更大的堆转换。
最简单的方法是让jvm在OOM上吐出一个堆转储,将其提供给MAT并根据泄漏可疑列表追溯到可能导致内存泄漏的原因。
-XX:+HeapDumpOnOutOfMemoryError
是您需要的JVM选项。另一种方法是在应用程序OOM之前以固定间隔生成一些堆转储,并比较MAT中的那些 - 它具有比较转储的工具。请参阅here以了解如何生成转储。有时需要检查堆元素的内容以确定它们的来源。
这并不容易,并且需要一些时间来学习如何放大堆转储中的罪魁祸首,但这是一项非常有用的技能。
答案 1 :(得分:0)
你似乎有很多char []对象。我发现我的大部分内存泄漏来自错误构造的循环,它们迭代的次数比它们应该的多。这会产生大量对象,导致内存泄漏。
实时字节只是活动对象占用的总字节数。
正在使用大量char[]
个实时字节。我会怀疑这可能是内存泄漏发生的原因。
您最好创建断点并逐步执行以查看内存泄漏发生的确切行。
阅读的好地方是Introduction to Profiling Java Applications in NetBeans IDE.应该能够帮助您了解如何在NetBeans中进行调试。
希望这有帮助。