如何从二进制堆转储中提取JVM运行时长或启动时间?
获取堆转储中的JVM运行时长/启动时间
我之前也碰到过一模一样的需求,分享几个在Eclipse Memory Analyzer(MAT)里亲测有效的方法:
方法一:通过系统属性java.vm.startup.time提取
JVM本身会把启动时间戳(毫秒级,从1970-01-01 UTC算起)存在系统属性java.vm.startup.time里,用MAT的OQL查询就能直接拿到:
- 加载堆转储后,点击顶部工具栏的OQL按钮打开查询窗口
- 输入以下查询语句:
SELECT prop.value.toString() FROM java.util.Properties$Entry prop WHERE prop.key.toString() = "java.vm.startup.time"
- 执行查询后,就能得到JVM启动的时间戳
- 切换到MAT的Overview页面,找到「Snapshot Information」里的「Time」字段(这是堆转储生成的时间),用这个时间减去启动时间戳,就能算出JVM的运行时长
方法二:查看RuntimeMXBean实例的startTime字段
JVM的RuntimeMXBean实现类(通常是java.lang.management.RuntimeMXBeanImpl)会直接存储启动时间:
- 打开MAT的Histogram视图,在搜索框输入
RuntimeMXBeanImpl - 右键点击该类,选择「List Objects > With incoming references」
- 在弹出的实例列表里,查看实例的
startTime字段,这个就是启动时间戳 - 同样用堆转储生成时间减去这个值,就能得到运行时长
方法三:旧版JDK的备选方案(比如OpenJDK 8)
在部分旧版JDK中,sun.misc.VM类的bootTime静态字段也存了启动时间戳:
- 在MAT的Class Browser里找到
sun.misc.VM类 - 查看它的静态字段
bootTime,直接获取时间戳即可
注意:这个方法兼容性较差,高版本JDK大多已经移除了这个类或字段,优先用前两种方法更稳妥。
内容的提问来源于stack exchange,提问作者turbanoff
相关产品推荐
相关产品推荐

