Извлечь время работы JVM из двоичного дампа кучи - PullRequest
4 голосов
/ 09 января 2020

Я анализирую несколько дампов кучи и мне интересно, как я могу получить время работы JVM (или время запуска) из дампа кучи. Используя анализатор памяти Eclipse, я легко могу получить Системные свойства и путь к классу, но не могу найти способ найти время безотказной работы.

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Вы можете попытаться найти класс sun.util.calendar.ZoneInfoFile, он содержит поле long CURRT. Его значение совпадает со временем запуска JVM в VisualVM (в моем случае, по крайней мере, с Oracle JVM ):

Screenshot from MAT

Type|Name |Value
---------------------
long|CURRT|1578570465
---------------------

Преобразователь эпохи говорит, что сейчас 2020/1/9 6.47 am EST (GMT-5), время, когда я запустил свое приложение Java. На всякий случай файл hprof был создан несколько минут спустя, в 7.03 am.

1 голос
/ 09 января 2020

Это может зависеть от реализации виртуальной машины, но, по крайней мере, время запуска и время работы OpenJDK HotSpot VM не сохраняется в куче, вместо этого они реализуются как собственные вызовы (см. sun.management.VMManagementImpl#getStartupTime() и sun.management.VMManagementImpl#getUptime0()). Это означает, что вы не найдете эти значения в существующем дампе кучи.

Однако вы можете использовать ManagementFactory.getRuntimeMXBean().getUptime() или ManagementFactory.getRuntimeMXBean().getStartupTime(), чтобы получить эти значения в работающей ВМ и, например, поместить их в системные свойства ( System.getProperties().setProperty()) для последующего анализа как часть дампа.

...