JVM技术问询:Spring应用运行时如何安全查看指定类字段值
安全查看Foo类injectedText字段值的实操方案
针对你提到的场景——在客户端机器上查看Foo类中injectedText字段的值(该字段通过@PostConstruct从配置code=injectedCode加载),结合@apangin提出的jmap+离线分析方案,这是最安全且不影响系统运行的方式,具体步骤如下:
先确认目标进程信息
首先需要找到运行Foo类的Java进程PID:
- Linux/macOS环境:执行
jps或者ps aux | grep java,找到对应的进程ID - Windows环境:执行
tasklist | findstr java,定位目标进程的PID
导出堆快照(无侵入)
使用jmap命令导出当前堆的快照文件,这个操作不会中断系统运行,仅会短暂占用磁盘IO:
jmap -dump:format=b,file=heap_dump.hprof <你的进程PID>
执行完成后,当前目录会生成一个heap_dump.hprof的堆快照文件。
离线分析堆快照获取字段值
你可以用JDK自带的工具来分析这个堆文件:
使用jhat工具:
执行命令启动分析服务:jhat heap_dump.hprof启动后在浏览器访问
http://localhost:7000,进入OQL查询页面,输入以下查询语句:select f.injectedText from Foo f执行后就能看到所有
Foo实例的injectedText字段值,也就是配置中的injectedCode。使用VisualVM(更直观):
如果客户端机器安装了VisualVM(JDK一般自带,路径在jdk/bin/jvisualvm.exe),直接打开后导入heap_dump.hprof文件,在"类"中找到Foo类,查看其实例的字段值即可。
补充说明
这个方案的核心优势是完全离线分析,导出堆快照的操作对运行中的系统几乎没有影响,非常适合客户端机器的场景。再次感谢@apangin提出的这个极具参考价值的方案!
内容的提问来源于stack exchange,提问作者pokemzok
相关产品推荐
相关产品推荐

