使用Arthas不重启服务进行java线上问题排查

1、Arthas下载安装解压启动

下载地址:https://arthas.gitee.io/download.html

windows环境建议用直接通过jar包启动,并加上utf-8编码,不然中文会有乱码

java -Dfile.encoding=UTF-8 -jar arthas-boot.jar <pid>

2、使用watch命令查看方法入参、返回值和对象的成员变量

watch <完整类名> 方法名 'params, returnObj,target' -x 2 -f

params:入参

returnObj:返回值

target:当前对象的成员变量

-x 打印对象深度,如果传入是对象类型看不到属性具体值,则可加大打印深度
-b    在方法调用之前观察
-e    在方法异常之后观察
-s    在方法返回之后观察
-f    在方法结束之后(正常返回和异常返回)观察
 
例:watch javacommon.base.hibernatedao.HibernateDao findPage '{params, returnObj}' -x 4 -f

其他高级用法参考官方文档https://arthas.gitee.io/watch.html

同名方法重载如何判断https://github.com/alibaba/arthas/issues/434

 

3、使用retransform / redefine命令进行热更新、实现不重启应用修改类,添加日志或修改逻辑

retransform和redefine都可以实现热更新,但是不能修改、添加、删除类的field和method,包括方法参数、方法名称及返回值

但是redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置

从3.4.6版本后添加了retransform命令,解决了上面的问题,推荐使用retransform https://arthas.aliyun.com/doc/retransform.html

热更新命令:retransform <类文件绝对路径>

如果对某个类执行 retransform 之后,想消除影响,恢复到修改之前,则需要:

删除这个类对应的 retransform

retransform -l //列出所有
retransform -d 1   //删除指定

retransform --deleteAll //删除所有

再重新触发 retransform --classPattern <类名>

4、使用trace命令查看方法执行时间,定位系统缓慢原因 https://arthas.gitee.io/trace.html

trace <类全名> <方法名>


版权声明:本文为gggauss原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。