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