java - 通过 JProfiler 查找内存泄漏

标签 java performance memory-leaks jprofiler

我的问题不同于this我已经对我的应用程序进行了分析,它太慢了。
完成一个过程后,我在堆 walker 中看到了一些 Activity 对象。

虽然我们将一些数据从数据库缓存到 HashMap,但是堆 walker 向我显示了一些 Activity 对象,例如 Resultset.getStringStatement.getString 不应该在那里。

HashMap.put() 比上述两种方法占用更少的内存。

我做的一切都很好吗?这个分析是否正确?或者我遗漏了任何东西,内存被 HashMap 本身占用,而 HeapWalker 只是向我展示了 JDBC 的方法(getStringexecuteQuery )。

最佳答案

既然你在谈论方法,我猜你正在查看堆遍历器的“分配” View 。该 View 显示对象的创建位置,而不是对象被引用的位置。有一个截屏 explains allocation recording in JProfiler .

HashMap.put 不会分配大量内存,它只会创建用于存储键值对的小型“Entry”对象。占用大量内存的对象是在将它们放入 HashMap 之前创建的。

Resultset.getStringStatement.getString 创建您从数据库中读取的 String 对象。因此,有理由假设其中一些对象的生命周期更长。

要找出对象仍在堆上的原因,您应该转到引用 View ,选择传入引用并搜索“到 GC 根的路径”。 “最大对象” View 对于跟踪过度内存使用也非常有帮助。

关于java - 通过 JProfiler 查找内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9409824/

相关文章:

java - 找不到类 FOP

java - Java 编码的更改需要每次重新启动 Tomcat

java - 对于限制 < 100 的循环使用 'short' 而不是 'int' 是否明智?

Mysql my.cnf 为空且 mysqltuner

performance - 帮助提高网站性能,尤其是在 IE8 中

swift - swift4 中用于淡出动画的 UIButton 扩展中的内存泄漏

c++ - std::map operator[] 如何导致基本数据类型的内存泄漏?

java - 如何设置项目引用 Eclipse

ios - 作为iVar的weakSelf

java - JAVA 日志记录的最佳方法/性能是什么?字符串或 StringBuilder 或 StringBuffer