java - 如何理解 java 中的这个 NetBeans 内存配置文件 session (可见内存泄漏)?

标签 java netbeans memory-leaks profiler memory-profiling

我是 Java 初学者,想知道如何在 NetBeans 中分析此内存配置文件 session 以及如何监视它以帮助搜索内存泄漏?

“实时字节”是什么意思?我可以看到,当我对所有 Activity 字节求和时,我只会得到 java 应用程序系统内存使用的一小部分。 为什么没有关于每个对象类型的分配字节的信息? “分配的对象”的值不断增加是否表明内存泄漏?

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

netbeans profiler

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

其他资源:

netbeans profiler

netbeans profiler

编辑:

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

heap

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

最佳答案

我一直喜欢Eclipse's MAT tool到 Netbeans 的内置诊断工具。 MAT 也可以处理比 Netbeans 更大的堆转储。

最简单的方法是让 jvm 在 OOM 上吐出一个 heapdump,将其提供给 MAT,并根据泄漏可疑列表回溯到内存泄漏的可能原因。

-XX:+HeapDumpOnOutOfMemoryError

是您需要的 JVM 选项。另一种方法是在应用程序 OOM 之前定期生成一些堆转储,并在 MAT 中比较它们——它有一个比较转储的工具。参见 here学习如何生成转储。有时需要检查堆元素的内容以找出它们的来源。

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

关于java - 如何理解 java 中的这个 NetBeans 内存配置文件 session (可见内存泄漏)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7045895/

相关文章:

ios - 内存泄漏。我怎样才能修复它们

java - NetBeans,以组件为中心的 GUI 生成器(组布局)

java - 处理 Spring/Tomcat 初始化失败

java - 如何防止 "Provided document path must not be null."Firestore?

java - Spring任务执行器和调度器

java - 在netbeans中使用javamail报错

java.net.MalformedURLException : For input string: "8080undefined" when run or debug Netbeans Java Project in Wildfly 15

c++ - 解除分配不会释放 Windows/C++ 应用程序中的内存

json - 德尔福XE8 : Memory Leak with method datasnap server

java - Tomcat 服务器(来自 XAMPP 包)无法从 Eclipse 启动