Как я могу получить дамп кучи на Java 5 без предварительного сбора мусора?

У нас есть долго работающее серверное приложение, работающее на Java 5, и мы можем видеть, как старое поколение медленно растет со временем. Он полностью освобожден на полном GC, но я хотел бы иметь возможность просматривать недоступные объекты в Eclipse MAT, используя дамп кучи. Я успешно получил дамп кучи с помощью +XX:HeapDumpOnCtrlBreak, но JVM всегда выполняет сборку мусора перед сбросом кучи. По-видимому, этого не происходит в Java 6, но сейчас мы застряли на 5. Есть ли способ предотвратить это?

5 ответов

Решение

Я предлагаю сторонний профилировщик, такой как YourKit, который может позволить вам делать снимки, не отключая GC. Дополнительный бонус, вы можете сделать снимок без всего изменения Ctrl-Break.

Используйте jconsole или visualvm или jmc или... другую консоль управления jmx. откройте HotSpotDiagnostic в com.sun.management. выберите метод dumpHeap и введите два параметра:

  • путь к файлу дампа
  • (true/false) выводит только живые объекты. использование false сбросить все объекты.

Обратите внимание, что файл дампа будет записан JVM, к которой вы подключены, а не JVisualVM, поэтому, если JVM работает в другой системе, он будет записан в этой системе.

Вы пробовали стандартный инструмент jmap, поставляемый с JDK? Платформа jmap была официально представлена ​​в Java 5.

Пример командной строки: /java/bin/jmap -heap:format=b

Результат может быть обработан с помощью стандартного инструмента jhat или приложений GUI, таких как MAT.

У меня есть некоторый код, который может программно получить дамп кучи через JMX:

Ссылка: JmxHeapDumper.java

Комментарии в исходном коде содержат 2 ссылки на статьи, которые содержали полезную информацию о том, как делать дампы кучи. Я не знаю наверняка, но если вам повезет, возможно, подход JMX поможет избежать GC. Надеюсь это поможет!

jProfiler ( ej-technologies) может сделать это.

Другие вопросы по тегам