如何查看Java堆中的内容?

时间:2020-03-06 14:50:46  来源:igfitidea点击:

我设法在正在开发的Java应用程序中获得内存"泄漏"。运行我的JUnit测试套件时,我会随机退出内存异常(java.lang.OutOfMemoryError)。

我可以使用哪些工具来检查我的Java应用程序的堆,以查看正在耗尽我的所有堆的东西,以便可以确定哪些保留了对应该能够进行垃圾收集的对象的引用。

解决方案

如果我们使用的系统支持GTK,则可以尝试使用JMP。

使用分析器,例如JProfiler或者YourKitProfiler

JProfiler对我来说效果很好。

http://www.ej-technologies.com/products/jprofiler/overview.html

如果我们需要免费的东西,请尝试使用VisualVM

从项目的描述:

VisualVM is a visual tool integrating commandline JDK tools and lightweight profiling capabilities. Designed for both development and production time use.

VisualVM包含在Java的最新版本中。我们可以使用它来创建堆转储,并查看其中的对象。

另外,我们也可以使用jmap(在jdk / bin目录中)创建一个heapdump命令:

jmap -dump:format=b,file=heap.bin <pid>

我们甚至可以使用它来快速获取所有对象的直方图

jmap -histo <pid>

我可以推荐使用Eclipse Memory Analyzer(http://eclipse.org/mat)进行堆转储的高级分析。它使我们可以精确地找出为什么某个对象或者一组对象仍然存在。这是一个博客条目,向我们显示Memory Analyzer可以做什么:http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-点击/

我们可以尝试使用JRockit Mission Control工具套件中的"内存泄漏检测器"。它允许我们在JVM运行时检查堆。我们无需一直拍摄快照。我们可以只在线连接到JVM,然后查看垃圾回收之间的堆如何变化。我们还可以检查对象,以图形方式遵循引用,并从应用程序当前分配对象的位置获取堆栈跟踪。这是一个简短的介绍。

该工具可免费用于开发,我们可以在此处下载。

使用Eclipse内存分析器

在分析堆转储时,没有其他工具可以与它的功能,性能和价格(免费和开源)相提并论。