如何在java中查看堆中的内容?

v2g6jxz6  于 2021-08-25  发布在  Java
关注(0)|答案(8)|浏览(394)

我已经设法在我正在开发的java应用程序中获得了内存“泄漏”。在运行junit测试套件时,我会随机出现内存不足异常(java.lang.outofmemoryerror)。
我可以使用什么工具来检查java应用程序的堆,以查看是什么耗尽了我所有的堆,这样我就可以确定是什么保留了对应该能够被垃圾收集的对象的引用。

xv8emn3q

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/

41zrol4v

41zrol4v2#

如果您需要免费的东西,请尝试visualvm
根据项目说明:
visualvm是一种集成命令行jdk工具和轻量级评测功能的可视化工具。设计用于开发和生产时间。

iswrvxsc

iswrvxsc3#

这是一个很老的问题。很多人可能已经开始使用intellij了,因为它最初是有答案的。intellij有一个插件,可以显示内存使用情况,称为jvm调试器内存视图。

r3i60tvu

r3i60tvu4#

使用像jprofiler或yourkitprofiler这样的探查器

syqv5f0l

syqv5f0l5#

jprofiler为我工作得很好。。。。
http://www.ej-technologies.com/products/jprofiler/overview.html

gev0vcfq

gev0vcfq6#

使用eclipse内存分析器
据我所知,在分析堆转储时,没有任何其他工具接近其功能、性能和价格(免费和开源)。

j9per5c4

j9per5c47#

如果您使用的是支持gtk的系统,那么可以尝试使用jmp。

e5nqia27

e5nqia278#

您可以尝试jrockit任务控制工具套件中的内存泄漏检测器。它允许您在jvm运行时检查堆。你不需要一直拍快照。您可以在线连接到jvm,然后查看垃圾收集之间堆的变化。您还可以检查对象,以图形方式跟踪引用,并从应用程序当前分配对象的位置获取堆栈跟踪。这里是一个简单的介绍。
该工具可免费用于开发,您可以在此处下载。

相关问题