如何在jvm dump出的堆文件中查看指定成员数据,或者全局变量

很多时候,当程序OOM或者其他异常情况时,我们需要搞清楚当时应用内部数据情况,所有某些时候我们需要查看当时内存镜像中某些成员变量的值。

比如查看当时内存实例中数据库账号,密码是否正确等等。

直接进入正题,我们首先搭建一个测试使用的springboot项目,除了基本模板代码外,剩余代码如下:
在这里插入图片描述

我们预期目标为通过镜像实例去查看DemoApplication中三个属性:

  • tt
  • tt1
  • bb
    以及 T2 对象中的静态属性: bbb

项目搭建成功后,启运行项目,接着使用命令导出运行中的应用的内存镜像
导出命令:

 jmap -dump:format=b,file=文件名.hprof <进程ID>

接下来使用分析工具,这里使用:MemoryAnalyzer, 大家没有可以自行去下载。
工具大概步骤为:

1.使用工具载入镜像文件

载入内存镜像后点击箭头所示的统计图表
在这里插入图片描述

接下来咱们先查看静态属性 T2.aaa

  1. 首先使用过滤器筛选出目标类T2,箭头所示部分输入T2
    在这里插入图片描述
    接着回车,筛选结果就出来包含T2的所有筛选结果:
    在这里插入图片描述
    点击 Go into 后 即可看到bbb属性的值了,如下图:

在这里插入图片描述

接下来我们查看DemoApplication中的两个属性值:
还是老样子,首先使用过滤器筛选出目标类DemoApplication示例如下:
在这里插入图片描述

这里可以看到有两个类,原因是因为有一个是cglib代理生成的,这个不要管,点击DemoApplication即可看到左侧类的属性, 此时老规矩,要查看那个属性就右键goto进去,即可查看到对应变量的值。

最后值得一提的是,如果是一些会被GC回收的数据,则不一定能看到,因为会被回收的哟!

好了,分享结束了。感谢大家!

posted @   枫潇雨  阅读(412)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示