【问题标题】:Extract JVM uptime from binary heap dump从二进制堆转储中提取 JVM 正常运行时间
【发布时间】:2020-04-27 00:37:04
【问题描述】:

我正在分析几个堆转储,并且对从堆转储中获取 JVM 正常运行时间(或启动时间)的方法感兴趣。使用 eclipse 内存分析器我可以轻松获取系统属性和类路径,但找不到正常运行时间的方法。

【问题讨论】:

标签: java jvm heap-dump hprof


【解决方案1】:

您可以尝试搜索sun.util.calendar.ZoneInfoFile 类,它包含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

【讨论】:

  • 这似乎在 JDK 11 或更早版本中不起作用。根据快速测试,“currt”(忽略大小写)存在于 12.0.1 和 13-ea 生成的堆转储中,但不存在 1.8.0_172 或 11.0.3。
  • @kaan,实际上我在 Oracle JDK 1.8.211 上得到了这个结果
【解决方案2】:

这可能取决于 VM 实现,但至少 OpenJDK HotSpot VM 的启动时间和正常运行时间不会存储在堆上,而是作为本机调用实现(参见 sun.management.VMManagementImpl#getStartupTime()sun.management.VMManagementImpl#getUptime0())。这意味着您不会在现有堆转储中找到这些值。

但是,您可以使用 ManagementFactory.getRuntimeMXBean().getUptime()ManagementFactory.getRuntimeMXBean().getStartupTime() 在正在运行的 VM 中获取这些值,例如将它们放在系统属性 (System.getProperties().setProperty()) 中,以便稍后作为转储的一部分进行分析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多