在生产系统上详细分析 Tomcat 堆

Posted

技术标签:

【中文标题】在生产系统上详细分析 Tomcat 堆【英文标题】:Analyze Tomcat Heap in detail on a production System 【发布时间】:2010-09-27 03:43:52 【问题描述】:

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

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

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

【问题讨论】:

您想查看比 jconsole 提供的更多信息吗? 【参考方案1】:

你可以试试jmap,JDK Development Tools 之一。您可以使用 jhat 与输出一起使用您的 Web 浏览器来遍历堆转储。

有关简短说明,请参阅this answer。

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

【讨论】:

【参考方案2】:

我已成功使用HeapAnalyzer tool from IBM's alphaWorks。它从 Java 的堆配置文件 hprof 中获取输出,并对其进行分析以向您显示最可能的内存泄漏。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

在这里查看我的答案:

Strategies for the diagnosis of Java memory issues

这里也有提示:

How can I figure out what is holding on to unfreed objects?

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

你可以在这里下载free

【讨论】:

以上是关于在生产系统上详细分析 Tomcat 堆的主要内容,如果未能解决你的问题,请参考以下文章

一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

(七) 下篇 Android 性能优化 Perfetto 详细介绍

基于生产环境的JVM调优-结果分析

Tomcat优化和JVM分析工具

记一次生产环境tomcat线程数打满情况分析

Java进程的dump文件分析?