Java 如何通过JMX检测OutOfMemoryError

Java 如何通过JMX检测OutOfMemoryError,java,heap,jmx,out-of-memory,Java,Heap,Jmx,Out Of Memory,哪个MBean告诉我java.lang.OutOfMemoryError:PermGen空间发生在我通过JMX监督的java应用程序上 谢谢。不幸的是,没有。如果jvm中有什么东西记得抛出了OOME,我会很高兴,但目前(至少在jdk 6中)什么都没有 您所能做的最好的事情就是在MemoryPool中设置阈值,并查看这些阈值何时被超过(尽管这并不一定意味着内存不足……。OutOfMemoryError是JVM最后一次求助。就其设计而言,当JVM抛出此错误时,它将处于不确定状态。尽管JVM可能会从O

哪个MBean告诉我java.lang.OutOfMemoryError:PermGen空间发生在我通过JMX监督的java应用程序上


谢谢。

不幸的是,没有。如果jvm中有什么东西记得抛出了OOME,我会很高兴,但目前(至少在jdk 6中)什么都没有


您所能做的最好的事情就是在MemoryPool中设置阈值,并查看这些阈值何时被超过(尽管这并不一定意味着内存不足……。

OutOfMemoryError是JVM最后一次求助。就其设计而言,当JVM抛出此错误时,它将处于不确定状态。尽管JVM可能会从OOM状态恢复,但它不是可以依赖的东西,它完全处于确定性状态。特别是“PermGen空间”几乎肯定是一条死胡同,因此您不能依赖JVM来响应任何东西,包括JMX


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

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

正如pap提到的,JVM处于一种不确定的状态,我不太清楚为什么java工程师会这样做,因为它可以掩盖您有一个OOM的事实。在大多数情况下,我发现最好是获取堆并杀死JVM,这可以通过以下属性实现

-XX:onAutofmemoryError=“kill-9%p” -XX:+HEAPDUMPONAUTOFMEMORYERROR