Как я могу получить дамп кучи на 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. Надеюсь это поможет!