从二进制堆转储中提取 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.