Эквивалентность дампов ядра для Java - PullRequest
9 голосов
/ 20 марта 2010

До сих пор я узнал о создании дампа потока и дампа кучи с использованием jstack и и jmap соответственно.

Тем не менее, jstack поток дампа содержит только тексты, описывающие стек в каждом потоке. А при открытии дампа кучи (файл .hprof) в Java VisualVM отображаются только объекты, выделенные в куче.

Что я действительно хочу, так это уметь видеть стек, переключаться на определенный кадр стека и наблюдать за локальными переменными. Этот вид посмертной отладки может обычно выполняться с помощью таких инструментов, как WinDbg, gdb и файл ядра (для родной программы C ++.)

Интересно, существует ли такой файл 'core' (который позволит мне отлаживать в неживой среде) в Java?

Ответы [ 4 ]

5 голосов
/ 16 ноября 2011

Java делает. Если вы используете IBM VM, используйте com.ibm.jvm.Dump.SystemDump() для программной генерации дампа. Это можно отладить с помощью отладчика. Я считаю, что «уничтожение» вашего Java-процесса также должно привести к системному дампу. Для Unix используйте kill -4 pid, где pid - это идентификатор процесса, который можно запросить, набрав top | grep java, если у вас запущен 1 экземпляр VM.

Вы также можете добавить -Xdump:system или -Xdump:heap и т. Д. В командную строку Java для фильтрации событий и создания дампов по определенным событиям, таким как остановка виртуальной машины (-Xdump:system:events=vmstop), полные сборки мусора (-Xdump:system:events=fullgc) и т. Д. Примечание. в зависимости от размера кучи создание дампов на полном ГХ может оказаться не очень хорошей идеей (то есть вы можете создать 50 дампов за 20 секунд, если объем кучи вырастет с 4 до 60 миллионов за 20 секунд), поэтому вы можете добавить счетчик как -Xdump:system:events=fullgc,range=50..55, который генерирует 5 ядер между 50-м и 55-м полным сбором мусора.

2 голосов
/ 20 марта 2010

Я нашел соответствующую информацию на форуме Sun и в обсуждении SO : мне не очень повезло с этим, но это может сработать в вашем случае.

Примечание: некоторые из упомянутых инструментов являются инструментами Java, но не поддерживаются и недоступны в версиях JDK для Windows.

1 голос
/ 16 ноября 2011

Некоторые операционные системы (например, Solaris mdb или gdb в Linux) поддерживают использование обычного встроенного отладчика для файлов дампа, а также некоторую специальную поддержку для отображения кадров стека Java. Но это довольно хардкор и, вероятно, не то, что вам нужно, так как он плохо интегрирован с отладчиком Java.

1 голос
/ 20 марта 2010

Я не думаю, что такой механизм дампа существует в стандартной Java.

...