vmtool这个命令最大的作用是可以对内存对象的查询。
我个人总结的一些使用场景:
- 项目中读取配置文件,初始化的配置类。我们在排查问题时候,需要确认配置类属性值是否符合预期
- 项目中各种缓存用的Map,List等等。在排查问题时候需要确认当前缓存的信息是否符合预期
示例1:
这个类会在项目初始化的时候,做缓存map的初始化操作。大家平时项目代码中可能也会有这样的一些缓存map(读取数据库,定时刷新等等的map)。
如果我们要查看缓存map的内容来定位问题,就可以使用vmtool来实现。
示例2:
ConfigProperties是一个读取配置文件配置类,如果我们要查看线上配置类读取初始化的属性是否正确,可以借助vmtool.
vmtool命令基本结构:
vmtool --action getInstances --className {你需要查看的类} --express '{表达式}' -x 3
--express
:可以查看指定的某个属性字段数据-x 3
:可以调整对象输出的层级,对于层级比较多的对象可以加大-x参数值-c
:对于一个jvm里有多个相同类对象时候,可以用-c参数指定要查看的对象的classloader的hash值来实现(该类的classloader的hash值可以用sc参数查询)
tips: 表达式里instances[0]这一部分大部分使用情况下也可以保持不变
我们调整下express再执行一次命令,来实现查看map里具体数据:
补充
最后补充下-c参数指定classloader的hash值获取命令sc
sc命令:sc -d {全类名}
vmtool通过-c 指定classloader hash值。