Есть ли способ обнаружить, что процессу Java не хватает памяти (например, пространство PermGen) и перезапустить его с помощью контракта SMF?
Зависит от вашей виртуальной машины Java. Если вы используете виртуальную точку доступа, вы можете сделать следующее.
Используйте параметр -XX: OnOutOfMemoryError = java cli, чтобы отправить сигнал SIGKILL процессу, это заставит SMF снова запустить его, SIGKILL необходим, потому что процесс Java OutOfMemory не отвечает ни на какие сигналы. Вы можете добавить параметр -XX: -HeapDumpOnOutOfMemoryError, чтобы получить дамп кучи для анализа, однако это может занять много места.
Документация: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html