【问题标题】:How to diagnose OutOfMemoryErrors in Tomcat 7?如何诊断 Tomcat 7 中的 OutOfMemory 错误?
【发布时间】:2023-04-10 18:14:01
【问题描述】:

我有几个应用程序在 Tomcat7 实例中运行。

偶尔,我注意到日志中有 OutOfMemoryErrors。

我怎样才能知道是哪个应用程序(理想情况下 - 哪个)类导致了它们?

更新 1(25.12.2014 11:44 MSK):

我更改了应用程序中的某些内容(在 servlet 上下文被破坏时添加了对 Quartz 调度程序的关闭调用),这可能导致内存泄漏。

现在我的内存消耗图表如下所示。

它们中的任何一个是否表明应用程序中存在内存泄漏?

如果是,是哪一个?

【问题讨论】:

  • 请记住,它通常不会像导致它的单个类那么简单;如果你深入研究这一点,你就可以尽可能地用最少的隧道视野来做到这一点。 OutOfMemory 也可能出于正当的原因发生 - 您的堆根本不足以满足所有加入的应用程序在特定高峰时刻所需的数量。

标签: java tomcat jakarta-ee tomcat7


【解决方案1】:

关于 http://www.oracle.com/technetwork/java/javase/clopts-139448.html 有一个很好的文档

  • 使用上面链接中描述的 vm 参数创建一个 heapdump。
  • 分析这个堆转储,例如使用 memoryanalzyer(https://eclipse.org/mat/)。

【讨论】:

    【解决方案2】:

    OOM 可能由于多种原因而发生。

    1.) 内存泄漏

    2.) 大量局部变量等的生成

    OOM 是内存泄漏的常见迹象。本质上,当没有足够的空间来分配新对象时会引发错误。

    很少有异常消息

    1. java.lang.OutOfMemoryError: Java 堆空间
    2. java.lang.OutOfMemoryError: PermGen 空间
    3. java.lang.OutOfMemoryError: 请求的数组大小超过 VM 限制
    4. java.lang.OutOfMemoryError: 请求字节。交换空间不足?
    5. java.lang.OutOfMemoryError:(本机方法)

    更多详细信息hereofficial

    参考thisthis

    需要分析堆转储/线程转储等

    Detecting Memory leak

    【讨论】:

      【解决方案3】:

      您可以使用 jmap 。它将给出java进程的快照。

      内存中有多少对象与对象大小。

      jmap -histo #processID
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-19
        • 2010-10-16
        • 1970-01-01
        • 2019-12-02
        • 2021-04-29
        • 2011-06-08
        • 2012-10-16
        相关资源
        最近更新 更多