【问题标题】:How to detect OutOfMemoryError via JMX如何通过 JMX 检测 OutOfMemoryError
【发布时间】:2012-03-23 14:28:37
【问题描述】:

哪个 MBean 告诉我 java.lang.OutOfMemoryError: PermGen space 发生在我通过 JMX 监督的 Java 应用程序中。

谢谢。

【问题讨论】:

    标签: java out-of-memory heap-memory jmx


    【解决方案1】:

    同意没有 bean,但您可以通过 jmx 监控堆大小。

    正如 pap 提到的 JVM 处于无法确定的状态,我不确定 Java 工程师为什么这样做,因为它可以掩盖您有 OOM 的事实。在大多数情况下,我发现最好获取堆并终止 JVM,您可以使用以下属性来执行此操作。

    -XX:OnOutOfMemoryError="kill -9 %p" -XX:+HeapDumpOnOutOfMemoryError

    【讨论】:

      【解决方案2】:

      很遗憾,没有。如果 jvm 中的 something 记得抛出了 OOME,但目前(至少从 jdk 6 开始)没有任何反应,我会喜欢它。

      您可以做的最好的事情是在 MemoryPools 中设置阈值并查看何时超过了这些阈值(尽管这并不一定意味着您内存不足...)。

      【讨论】:

        【解决方案3】:

        OutOfMemoryError 是 JVM 的最后一次求助。按照它的设计,当 JVM 抛出这个错误时,它将处于一个不确定的状态。尽管 JVM 可能从 OOM 状态中恢复,但它不是可以依赖的东西,而且它是完全不确定的。特别是“PermGen 空间”几乎可以保证是一个死胡同,所以你不能依赖 JVM 来响应任何东西,包括 JMX。

        正如 jtahlborn 所建议的那样,您可以监视内存池并尝试在错误发生之前捕获它,但这可能不是很精确。另一种选择是不断检查系统错误日志并在记录异常时捕获异常。

        【讨论】:

          猜你喜欢
          • 2012-07-25
          • 2015-01-03
          • 2016-08-18
          • 2013-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多