Я бы не стал восстанавливаться после ошибки OutOfMemoryError, поскольку некоторые объекты могут оказаться в неопределенном состоянии (просто подумать о ArrayList, который не может выделить свой массив для хранения даты, например).
Что касается вашего вопроса, я бы заподозрил, что -XX: + HeapDumpOnOutOfMemoryError намеренно создает только один дамп, чтобы предотвратить несколько дампов кучи: просто подумайте о нескольких потоках, генерирующих OOME одновременно, вызывая дамп кучи для каждого выброшенного исключение.
В заключение: не пытайтесь восстанавливаться из OOME и не ожидайте, что JVM напишет больше, чем один дамп кучи. Однако, если вы все еще чувствуете необходимость генерировать дамп кучи, вы можете попытаться вручную обработать исключение OOME и вызвать jmap для создания дампа или использовать «-XX: + HeapDumpOnCtrlBreak» (хотя не уверен, как программно моделировать CtrlBreak) .