2013-12-17 2 views
2

Предположим, вы получили дамп кучи Java для анализа утечки памяти (после -XX:+HeapDumpOnOutOfMemoryError или из неконтролируемой партии).Вызов GC на куче кучи Java

Как уменьшить количество объектов в дампе, вызвав некоторый процесс GC, который в любом случае очищается GC после процесса сброса?

ответ

0

Кажется, что Eclipse, Memory Analyzer Can I run Java garbage collection against a heap dump file? сделать:

By default unreachable objects are removed 

@Guntram Blohm. Как вы говорите, причина, по которой OOME не работает, или менеджер хранилища не смог восстановить достаточное количество памяти. Если вам нужен длинный массив для фрагментированной памяти, возможно, что GC вообще не выполняется!

4

Java будет выдавать ошибку только из памяти, если после GC все еще недостаточно места. Таким образом, количество объектов не уменьшается, каждый объект в вашей куче все еще доступен где-то, или он бы очистил GC, который предшествует ошибке OOM.

+0

Даже на гарантии «ПерминГен» GC? – gavenkoa

+0

@gavenkoa Вы не можете сбросить PermGen, так что там тоже ничего не удалить. –

+1

Из спецификации JVM, http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.3, раздел 6.3: OutOfMemoryError: «Реализация Java Virtual Machine закончилась либо виртуальной, либо физической памяти, и менеджер автоматического хранения не смог восстановить достаточное количество памяти для удовлетворения запроса на создание объекта ». Это означало бы, что GC был запущен в куче, если вы запросили новый объект в куче или на пермгене, если бы ваш объект должен был туда попасть. –

1

Возможные решения;

  • уменьшить размер кучи при исследовании утечки памяти. Это создает меньшую дампу.
  • используйте коммерческий инструмент, такой как YourKit, который не нуждается в столько памяти для анализа кучи кучи.
  • использование больше память. Вы можете купить 32 ГБ за 400 долларов.

Вы не можете сбрасывать PermGen, и ваш дамп имеет только достижимые объекты или у вас не было бы OOME в первую очередь.