从二进制堆转储中提取 JVM 正常运行时间
Extract JVM uptime from binary heap dump
我正在分析几个堆转储,并且对可以从堆转储中获取 JVM 正常运行时间(或启动时间)的方法很感兴趣。使用 Eclipse 内存分析器,我可以轻松获取系统属性和 class 路径,但无法找到正常运行时间的方法。
这可能取决于 VM 实现,但至少在 OpenJDK HotSpot 上,VM 启动时间和正常运行时间不会存储在堆上,而是作为本机调用实现(参见 sun.management.VMManagementImpl#getStartupTime()
和 sun.management.VMManagementImpl#getUptime0()
).这意味着您不会在现有堆转储中找到这些值。
但是,您可以使用 ManagementFactory.getRuntimeMXBean().getUptime()
或 ManagementFactory.getRuntimeMXBean().getStartupTime()
在 运行 VM 中获取这些值,例如将它们放入系统属性 (System.getProperties().setProperty()
) 中,以便稍后作为转储的一部分进行分析。
您可以尝试搜索 sun.util.calendar.ZoneInfoFile
class,它包含 long CURRT
字段。它的值与 VisualVM 中的 JVM 启动时间匹配(在我的例子中,至少与 Oracle JVM):
Type|Name |Value
---------------------
long|CURRT|1578570465
---------------------
The epoch converter 说是 2020/1/9 6.47 am EST (GMT-5)
,我启动 Java 应用程序的时间。以防万一,hprof
文件是在几分钟后创建的,位于 7.03 am
.
我正在分析几个堆转储,并且对可以从堆转储中获取 JVM 正常运行时间(或启动时间)的方法很感兴趣。使用 Eclipse 内存分析器,我可以轻松获取系统属性和 class 路径,但无法找到正常运行时间的方法。
这可能取决于 VM 实现,但至少在 OpenJDK HotSpot 上,VM 启动时间和正常运行时间不会存储在堆上,而是作为本机调用实现(参见 sun.management.VMManagementImpl#getStartupTime()
和 sun.management.VMManagementImpl#getUptime0()
).这意味着您不会在现有堆转储中找到这些值。
但是,您可以使用 ManagementFactory.getRuntimeMXBean().getUptime()
或 ManagementFactory.getRuntimeMXBean().getStartupTime()
在 运行 VM 中获取这些值,例如将它们放入系统属性 (System.getProperties().setProperty()
) 中,以便稍后作为转储的一部分进行分析。
您可以尝试搜索 sun.util.calendar.ZoneInfoFile
class,它包含 long CURRT
字段。它的值与 VisualVM 中的 JVM 启动时间匹配(在我的例子中,至少与 Oracle JVM):
Type|Name |Value
---------------------
long|CURRT|1578570465
---------------------
The epoch converter 说是 2020/1/9 6.47 am EST (GMT-5)
,我启动 Java 应用程序的时间。以防万一,hprof
文件是在几分钟后创建的,位于 7.03 am
.