Arthas调试线上代码技巧
1、背景
1、测试没问题,但生产环境没有生效,需要查看生产环境代码是否更新上去(反编译)
2、在没有日志的情况下,我们不知道客户端请求过来的参数是什么,临时加接口日志再发版是一件很复杂的事情(监视方法执行)
3、有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的(thread -b)
4、需要快速定位应用的热点,生成火焰图(profile)
5、进行性能调优时需要在代码里添加大量计时器代码,还要重新部署,太麻烦(trace)
2、安装
其实就是下载一个jar包
1 | curl -O https://arthas.aliyun.com/arthas-boot.jar |
启动之后,就会列出当前系统上所有的java进程,输入进程前面的序号,连接到相应的应用进程。
3、反编译代码
1 | jad --source-only com.controller.HomePageController getSaleData --lineNumber false |
注意:访问类的静态成员时(属性或方法),才会进行类加载。所以想要反编译静态方法,需要先确保调用一次
4、监视方法执行
1 | watch com.data.controller.baseInfo.InstrumentBaseController list '{params,returnObj,throwExp}' -n 5 -x 3 |
5、执行静态方法
1 | ognl '@com.chivd.common.utils.DateUtils@getDate()' |
6、找出当前阻塞其它线程的线程
有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 为了排查这类问题, arthas 提供了thread -b, 一键找出那个罪魁祸首
1 | thread -b |
7、火焰图
profiler命令可以在一段时间内对数据采样,生成火焰图。该命令对cpu进行300秒的采样,采样后生成svg或html格式的火焰图。
1 | profiler start --duration 300 |
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有”平顶”(plateaus),就表示该函数可能存在性能问题
8、性能调优计时
trace命令能记录指定方法的调用路径,并统计方法向下一层调用的耗时。
1 | trace *InstrumentBaseController list |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 去码头整些薯条!
评论