在 Java 中,我怎样才能看到堆里有什么?

2022-09-02 09:10:02

我已经设法在我正在开发的Java应用程序中获得了内存“泄漏”。当运行我的JUnit测试套件时,我会随机出现内存不足异常(java.lang.OutOfMemoryError)。

我可以使用哪些工具来检查我的java应用程序的堆,以查看什么用完了我的所有堆,以便我可以找出对应该能够进行垃圾回收的对象的引用的内容。


答案 1

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

或者,您也可以使用 jmap 创建一个堆转储命令(在 jdk/bin dir 中):

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

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

jmap -histo <pid>

我可以推荐Eclipse Memory Analyzer(http://eclipse.org/mat)来对堆转储进行高级分析。它可以让你准确地找出为什么某个对象或一组对象是活的。下面是一个博客文章,向您展示内存分析器可以执行的操作:http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/


答案 2

如果你需要一些免费的东西,试试VisualVM

从项目的描述中:

VisualVM 是一个可视化工具,集成了命令行 JDK 工具和轻量级分析功能。专为开发和生产时间而设计。


推荐