-XX: + HeapDumpOnOutOfMemoryError не создает файл hprof в OOM - PullRequest
4 голосов
/ 05 октября 2009

Я начинаю свой код Java (1.6.0_16 в Vista) со следующими параметрами (среди прочих) -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs. Я запускаю код и вижу в логах два OOM.

Первое, что я знаю, потому что я вижу в stdout, что создается файл hprof:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to ../logs\java_pid4604.hprof ...
Heap dump file created [37351818 bytes in 1.635 secs]

И затем, ближе к концу кода, я получаю еще одно OOM, я фиксирую это, но у меня не создается второй файл hprof. Кто-нибудь знает, почему это? Это потому, что я захватил исключение OOM?

Ответы [ 2 ]

5 голосов
/ 05 октября 2009

Я бы не стал восстанавливаться после ошибки OutOfMemoryError, поскольку некоторые объекты могут оказаться в неопределенном состоянии (просто подумать о ArrayList, который не может выделить свой массив для хранения даты, например).

Что касается вашего вопроса, я бы заподозрил, что -XX: + HeapDumpOnOutOfMemoryError намеренно создает только один дамп, чтобы предотвратить несколько дампов кучи: просто подумайте о нескольких потоках, генерирующих OOME одновременно, вызывая дамп кучи для каждого выброшенного исключение.

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

2 голосов
/ 02 марта 2011

Недостаточно памяти генерирует только один дамп-файл при первой ошибке. Если вы хотите получить больше, вы можете попробовать jmap или оставить jconsole на jvm (версия 6), а затем, после того, как все закончится, т.е. утром, создать свой собственный дамп из jconsole (или по вашему выбору анализатора).

Подробнее о теме дампа можно прочитать в Eclipse MemoryAnalyser .

...