arthas前面的文章讲了怎么去使用命令排查线上问题,线上出了问题就需要我们去排查问题和处理程序异常,但是线上一般出问题不太好解决,总有一些奇怪的问题,当然很多场景是测试测试不到的,我们不能百分百保证线上不出问题,但是出了问题就需要排查问题。那么定位问题的核心在于分析业务场景,出现问题的根本在哪里,分析问题也很重要,当然定位不到问题我们可以借助第三方工具去排查和解决。
为啥要使用插件因为在线上问题出现你可以快速使用命令去监听,因为arthas的命令比较多常用的trace,monitor,watch都是常用命令。当然我们在实际场景下去写命令显得有点麻烦,这个时候就用到我们的插件了。
右键属性值或者注入的配置都可以:
这里面包含了全部使用命令,比如watch,trace,monitor,statck,还有springbean上下文,静态方法等。
watch com.*.service.impl.WechatAuthEventServiceImpl * '{params,returnObj,throwExp,target.wechatConfig}' -n 5 -x 3 'method.initMethod(),method.constructor!=null || !@java.lang.reflect.Modifier@isStatic(method.method.getModifiers())'
trace -E com.*.provider.service.impl.WechatAuthEventServiceImpl \\* -n 5 --skipJDKMethod false '1==1'
monitor com.*.service.impl.WechatAuthEventServiceImpl * -n 10 --cycle 10
stack com.v*.service.impl.WechatAuthEventServiceImpl * -n 5
不是所有的熟悉都可以监听的,我们程序执行的结果我们也会命令监听不了,
这时候我们可以使用:vmtool 命令去打印我们对象属性值,通过
vmtool -x 3 --action getInstances --className org.springframework.core.env.ConfigurableEnvironment --express '#standardServletEnvironment=instances[0],#allProperties={},#propertySourceIterator=#standardServletEnvironment.getPropertySources().iterator(),#propertySourceIterator.{#key=#this.getName(),#allProperties.add(" "),#allProperties.add("------------------------- name:"+#key),#this.getSource() instanceof java.util.Map ?#this.getSource().entrySet().iterator.{#key=#this.key,#allProperties.add(#key+"="+#standardServletEnvironment.getProperty(#key))}:#{}},#allProperties'
这样可以快速的定位和追踪我们程序执行的一些参数和内存信息。学会了吗?
————没有与生俱来的天赋,都是后天的努力拼搏(我是小杨,谢谢你的关注和支持)