9

使用 JMX 控制台分析了在 tomcat 中运行的轻负载 Web 应用程序,结果表明“PS Old Gen”增长缓慢但稳定。它从 200MB 开始,增长到大约 80MB/小时。

CPU 不是问题,它平均以 0-1% 的速度运行,但在某处它会泄漏内存,因此在部署后几天会变得不稳定。

我如何找出堆上分配了哪些对象?你知道有什么好的教程或工具吗?

4

6 回答 6

2

您可以尝试jmap,它是JDK 开发工具之一。您可以使用带有输出的jhat来使用 Web 浏览器遍历堆转储。

请参阅此答案以获取简短说明。

这经常出现,因此搜索这些工具应该会找到一些替代方案。

于 2008-12-16T15:46:31.710 回答
1

您可以使用NetBeans 分析器。它有 2 种模式,直接从 ide(对于 localhost)启动配置文件的 tomcat,或者使用提供的 JAR 和一些在服务器上运行配置的远程配置文件。

我在一个项目中使用它来解决内存泄漏问题,它很有用。

于 2008-12-16T16:10:47.560 回答
1

我使用IBM 的 alphaWorks 的 HeapAnalyzer 工具取得了很好的成功。它从 Java 的堆配置文件 hprof 中获取输出,并对其进行分析以向您展示最可能的内存泄漏。

于 2008-12-16T15:46:55.267 回答
1

在这里查看我的答案:

Java内存问题的诊断策略

这里也有提示:

我怎样才能弄清楚是什么保留了未释放的对象?

于 2009-01-08T11:26:36.060 回答
1

你所看到的都是正常的,除非你能证明不是这样。当旧空间中的 GC 发生时,额外的“已消耗空间”消失时,您无需分析堆。在某些时候,当已用空间达到最大堆大小时,您会观察到由您使用的默认 GC 引起的暂停,之后使用的内存应该会下降很多。只有在 GC 后它没有停止时,您可能会对仍然持有这些对象的内容感兴趣。

于 2012-11-25T21:43:48.350 回答
0

JRockit Mission Control 可以在连接到 JVM 时分析内存泄漏。无需一直拍摄快照。如果您有一个具有大堆的服务器,这将很有用。

只需将该工具连接到 JVM,它就会为您提供一个趋势表,您可以在其中查看增长最多的对象类型,然后您可以探索对这些对象的引用。您还可以在 JVM 运行时获取分配跟踪,因此您可以查看对象在应用程序中的分配位置。

你可以在这里免费下载

于 2008-12-18T23:49:58.020 回答