我已经设法在我正在开发的java应用程序中获得了内存“泄漏”。在运行junit测试套件时,我会随机出现内存不足异常(java.lang.outofmemoryerror)。我可以使用什么工具来检查java应用程序的堆,以查看是什么耗尽了我所有的堆,这样我就可以确定是什么保留了对应该能够被垃圾收集的对象的引用。
xv8emn3q1#
visualvm包含在java的最新版本中。您可以使用它来创建堆转储,并查看其中的对象。或者,也可以使用jmap(在jdk/bin目录中)创建heapdump命令行:
jmap -dump:format=b,file=heap.bin <pid>
您甚至可以使用它来获得所有对象的快速直方图
jmap -histo <pid>
我可以推荐eclipse内存分析器(http://eclipse.org/mat)用于堆转储的高级分析。它可以让您确切地了解为什么某个对象或一组对象是活动的。下面是一篇博客文章,向您展示了内存分析器的功能:http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/
41zrol4v2#
如果您需要免费的东西,请尝试visualvm根据项目说明:visualvm是一种集成命令行jdk工具和轻量级评测功能的可视化工具。设计用于开发和生产时间。
iswrvxsc3#
这是一个很老的问题。很多人可能已经开始使用intellij了,因为它最初是有答案的。intellij有一个插件,可以显示内存使用情况,称为jvm调试器内存视图。
r3i60tvu4#
使用像jprofiler或yourkitprofiler这样的探查器
syqv5f0l5#
jprofiler为我工作得很好。。。。http://www.ej-technologies.com/products/jprofiler/overview.html
gev0vcfq6#
使用eclipse内存分析器据我所知,在分析堆转储时,没有任何其他工具接近其功能、性能和价格(免费和开源)。
j9per5c47#
如果您使用的是支持gtk的系统,那么可以尝试使用jmp。
e5nqia278#
您可以尝试jrockit任务控制工具套件中的内存泄漏检测器。它允许您在jvm运行时检查堆。你不需要一直拍快照。您可以在线连接到jvm,然后查看垃圾收集之间堆的变化。您还可以检查对象,以图形方式跟踪引用,并从应用程序当前分配对象的位置获取堆栈跟踪。这里是一个简单的介绍。该工具可免费用于开发,您可以在此处下载。
8条答案
按热度按时间xv8emn3q1#
visualvm包含在java的最新版本中。您可以使用它来创建堆转储,并查看其中的对象。
或者,也可以使用jmap(在jdk/bin目录中)创建heapdump命令行:
您甚至可以使用它来获得所有对象的快速直方图
我可以推荐eclipse内存分析器(http://eclipse.org/mat)用于堆转储的高级分析。它可以让您确切地了解为什么某个对象或一组对象是活动的。下面是一篇博客文章,向您展示了内存分析器的功能:http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/
41zrol4v2#
如果您需要免费的东西,请尝试visualvm
根据项目说明:
visualvm是一种集成命令行jdk工具和轻量级评测功能的可视化工具。设计用于开发和生产时间。
iswrvxsc3#
这是一个很老的问题。很多人可能已经开始使用intellij了,因为它最初是有答案的。intellij有一个插件,可以显示内存使用情况,称为jvm调试器内存视图。
r3i60tvu4#
使用像jprofiler或yourkitprofiler这样的探查器
syqv5f0l5#
jprofiler为我工作得很好。。。。
http://www.ej-technologies.com/products/jprofiler/overview.html
gev0vcfq6#
使用eclipse内存分析器
据我所知,在分析堆转储时,没有任何其他工具接近其功能、性能和价格(免费和开源)。
j9per5c47#
如果您使用的是支持gtk的系统,那么可以尝试使用jmp。
e5nqia278#
您可以尝试jrockit任务控制工具套件中的内存泄漏检测器。它允许您在jvm运行时检查堆。你不需要一直拍快照。您可以在线连接到jvm,然后查看垃圾收集之间堆的变化。您还可以检查对象,以图形方式跟踪引用,并从应用程序当前分配对象的位置获取堆栈跟踪。这里是一个简单的介绍。
该工具可免费用于开发,您可以在此处下载。