从二进制堆转储中提取JVM正常运行时间

问题描述 投票:1回答:2

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

java jvm heap-dump hprof
2个回答
0
投票

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

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


0
投票

您可以尝试搜索sun.util.calendar.ZoneInfoFile类,它包含long CURRT字段。它的值与JavaVisualVM中的JVM正常运行时间匹配(在我的情况下,至少与Oracle JVM匹配):

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

[The epoch converter说是我启动Java应用程序的时间,美国东部标准时间6.47。

© www.soinside.com 2019 - 2024. All rights reserved.