代码之家  ›  专栏  ›  技术社区  ›  Andreas Petersson

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

  •  9
  • Andreas Petersson  · 技术社区  · 15 年前

    在使用jmx控制台分析了在tomcat中运行的一个轻负载web应用程序后,发现“ps old gen”增长缓慢但不变。它从200MB开始,每小时增长约80MB。

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

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

    6 回复  |  直到 11 年前
        1
  •  2
  •   Community Egal    7 年前

    你可以试试 jmap 其中之一 JDK Development Tools . 你可以使用 jhat 使用您的web浏览器来遍历堆转储的输出。

    this answer 简短的解释。

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

        2
  •  1
  •   erickson    15 年前

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

        3
  •  1
  •   jberges    15 年前

    你可以使用 NetBeans profiler . 它有两种模式,直接从ide(对于本地主机)启动tomcat profiled,或者使用提供jar的远程profileing和一些在服务器上运行config。

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

        5
  •  1
  •   Fabian Lange    11 年前

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

        6
  •  0
  •   Kire Haglin    15 年前

    jrockit任务控制可以在连接到jvm时分析内存泄漏。不需要一直拍快照。如果您有一个堆很大的服务器,这可能会很有用。

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

    你可以在这里下载 free