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

在使用JMX控制台分析了在tomcat中运行的轻量级Web应用程序之后,事实certificate“PS Old Gen”正在缓慢但不变地增长。 它以200MB开始,每小时增长约80MB。

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

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

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

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

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

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

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

我在项目中使用它来进行内存泄漏,这很有用。

在这里看到我的答案:

诊断Java内存问题的策略

这里也有提示:

我怎样才能弄清楚什么是不确定的物体?

你所看到的是正常的,除非你能certificate不是这样。 当旧空间中的GC发生时,当额外的“消耗空间”消失时,您不需要分析堆。 在某些时候,当使用的空间达到最大堆大小时,您将观察到由您使用的默认GC导致的暂停,之后使用的内存应该会大量减少。 只有在GC之后它没有下降时,您可能会对仍然保留这些对象的内容感兴趣。

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

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

你可以在这里免费下载