Как обнаружить OutOfMemoryError через JMX - PullRequest
2 голосов
/ 23 марта 2012

Какой MBean сообщает мне, что с моим Java-приложением произошло пространство java.lang.OutOfMemoryError: PermGen, которое я контролирую через JMX.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Согласен, что bean-компонента нет, но вы можете отслеживать размер кучи через jmx.

Как сказал Пап, JVM остается в неопределимом состоянии, я не совсем уверен, почему инженеры Java сделали это, поскольку это может скрыть тот факт, что у вас был OOM. В большинстве случаев я считаю, что лучше всего получить кучу и убить JVM, что вы можете сделать со следующими свойствами.

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

2 голосов
/ 23 марта 2012

OutOfMemoryError является своего рода последним криком о помощи от JVM. По самой своей схеме, когда JVM выдает эту ошибку, она будет в неопределимом состоянии. Несмотря на то, что JVM может восстанавливаться из состояния OOM, на это нельзя полагаться, и оно полностью недетерминировано. В частности, «пространство PermGen» почти гарантировано является тупиком, поэтому вы не можете полагаться на то, что JVM действительно реагирует на что-либо, включая JMX.

Как было сказано jtahlborn, вы можете отслеживать пулы памяти и пытаться отследить ошибку до того, как она произойдет, но это, вероятно, не будет очень точным. Другой вариант - постоянно проверять журнал системной ошибки и перехватывать исключение по мере его регистрации.

2 голосов
/ 23 марта 2012

к сожалению, нет. Мне бы понравилось, если бы что-то в jvm помнило, что OOME был брошен, но в настоящее время (по крайней мере, на jdk 6) ничего не происходит.

Самое лучшее, что вы можете сделать, - это установить пороги в MemoryPools и посмотреть, когда эти пороги были превышены (хотя это не обязательно означает, что у вас недостаточно памяти ...).

...