Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JProfiler查找内存泄漏_Java_Performance_Memory Leaks_Jprofiler - Fatal编程技术网

Java 通过JProfiler查找内存泄漏

Java 通过JProfiler查找内存泄漏,java,performance,memory-leaks,jprofiler,Java,Performance,Memory Leaks,Jprofiler,我的问题与我对我的应用程序进行分析的问题不同,它太慢了。 在完成一个进程后,我在heap walker中看到了一些活动对象 虽然我们正在将一些数据从数据库缓存到HashMap,但heap walker向我显示了一些活动对象,如Resultset.getString和Statement.getString,它们不应该在那里 HashMap.put()占用的内存比上述两种方法少得多 我做的一切都很好,这个分析正确吗?或者我丢失了任何东西,内存被HashMap本身占用,HeapWalker只是向我展示

我的问题与我对我的应用程序进行分析的问题不同,它太慢了。
在完成一个进程后,我在heap walker中看到了一些活动对象

虽然我们正在将一些数据从数据库缓存到
HashMap
,但heap walker向我显示了一些活动对象,如
Resultset.getString
Statement.getString
,它们不应该在那里

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


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

您可能看到的是连接(可能是其缓冲区缓存)或语句或结果集所持有的缓存数据

这可能是由于未关闭连接、语句或结果集,也可能是由于连接池。如果查看内存配置文件,您可能会看到“到GC根的路径”(到对象根的路径),这将指示存放
结果集
字符串的内容。您应该查看它是否在代码中,是否缓存在保留的内容中,或者是否在池中


注意:我没有使用JProfiler,但这是我跟踪它的方式。

既然您在谈论方法,我想您正在查看heap walker的“分配”视图。该视图显示创建对象的位置,而不是引用对象的位置。有一个银幕演员

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

Resultset.getString
语句.getString
创建从数据库读取的字符串对象。因此,我们有理由假设其中一些物体的寿命更长


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

感谢Ingo,我一直在看你,为你提供了与JProfiler相关的好答案。。我正期待着你的回答。。我有一个问题-这些对象(Resultset和Statement)在数据库进程完成后是否应该在堆中…?@NIVESHSENGAR否,它们不应该真的在堆中只要再问一个问题,我正在使用hashmap缓存一些数据,它通常在我们登录时填充。它能很好地繁殖,但它的大小在不断增长。当GC调用时,它的大小减小,但经过一段时间后,它又迅速增加。是记忆吗leakage@NIVESHSENGAR是的,随着时间的推移无限增长的缓存将被视为内存泄漏