trace com.primeton.dgp.assets.controller.DsResourcePoolController getResourcePool

文章插图
tt
tt方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测,使用方法如下:
tt -t com.primeton.dgp.assets.controller.DsResourcePoolController getResourcePool 执行此命令后,arthas会记录下指定方法的每次调用环境现场,并打印一些相关的信息,如调用时长、是否正常返回、是否抛出异常等 。

文章插图
显示所有被记录的调用列表
tt -l

文章插图
重做一次调用 。tt 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 INDEX 编号的时间片自主发起一次调用,从而解放你的沟通成本 。此时你需要 -p 参数 。通过 --replay-times 指定 调用次数,通过 --replay-interval 指定多次调用间隔(单位ms, 默认1000ms)
tt -i 1001 -p --replay-times 3 --replay-interval 3000 
文章插图
jad
jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑;反编译出来的源码是带语法高亮的,阅读更方便 。当我们看到某个方法的调用时长明显过长,或者时空隧道中某方法抛出异常,这个时候就可以直接反编译相关的方法,看看是否能找出原因 。

文章插图
其他
除了以上很常用的命令以外,arthas还有很多实用命令,大家可以参考官方文档来使用
https://arthas.aliyun.com/doc/index.html
另外,每一个命令都支持-help参数,可以查看该命令的说明、参数,甚至包括了使用例子,可以说是非常贴心了

文章插图
案例
案例1
我们准备了一个简单的springboot应用,应用内有一个Controller,返回一个字符串,代码如下:
@RestControllerpublic class DemoController {??@GetMApping(value = https://www.isolves.com/it/aq/fwq/2020-11-04/"/getDemo")public String getDemo(){return "demo 1";}} 启动程序,访问刚刚准备好的controller得到了下面的结果

文章插图
接下来我们要尝试在没有源码的情况下修改demo controller的返回值,并在不重启应用的情况下,使我们修改的返回值生效 。
首先启动arthas并织入到刚才的demo,然后反编译DemoController到临时文件夹 。
jad --source-only com.example.arthas.DemoController >/tmp/DemoController.java 接下来我们用vim修改反编译出来的代码

文章插图
查询加载原有DemoController类的ClassLoader
sc -d com.example.arthas.DemoController 重新编译修改后的类
mc -c 685f4c2e /tmp/DemoController.java 重新加载修改后的类
redefine -c 685f4c2e /opt/arthas/demo/com/example/arthas/DemoController.class 
文章插图
此时,无需重启应用,我们重新访问刚才的controller,会发现返回结果已经成功更改了 。

文章插图
案例2
某燃气系统由于被众多地区的燃气公司所使用,所以版本繁多,经历过很多轮的测试,其中比较耗时的当属性能测试了 。以往性能测试工作通常耗时很长,主要是性能测试人员并不一定熟悉项目代码,导致压力测试出现问题的时候不容易找到问题的所在 。
在本次的表具接口的性能测试中,我们使用Arthas工具进行故障的快速定位,大幅减少了性能测试的时间,达到了很好的效果 。
推荐阅读
- 下一代视频编码技术的云视频应用探索
- 腾讯云快直播——超低延迟直播技术方案及应用
- python:栈的理解与应用
- 光纤收发器的应用与讲解
- 教您使用Win10“查看可靠性历史记录”快速诊断电脑故障
- 2020年部署Web应用的4种方式
- 到底什么是Hash?Hash算法的原理和实际应用讲解
- 适用于任何设备的屏幕共享应用程序–Mirroring360
- SpringBoot运行源码分析:Spring应用上下文准备
- ICMP协议及应用
