在生产系统上详细分析 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内存溢出