内容简介:Arthas是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。 内部Gitlab: http://gitlab.alibaba-inc.com/middleware-container/arthas 内部在线诊断:http://start.alibaba-inc.com/arthas/web-console Github: ...
Arthas
是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
- 内部Gitlab: http://gitlab.alibaba-inc.com/middleware-container/arthas
- 内部在线诊断:http://start.alibaba-inc.com/arthas/web-console
- Github: https://github.com/alibaba/arthas
- 文档:https://arthas.aliyun.com/doc/
Arthas 3.4.6 版本带来下面全新的特性:
- 增加
retransform
命令,可以实现更完善的热更新代码功能 watch
打印调用发生的具体位置,即函数入口/退出/异常退出,可以直观定位watch/trace
等命令支持--exclude-class-pattern
选项,可以排除掉指定的类- 大幅改进HTTP API的稳定性
retransform 命令工作原理
在之前,Arthas里通过 redefine 命令可以实现热更新功能。但是 redefine命令有缺陷:
redefine
命令和jad
/watch
/trace
/monitor
/tt
等命令会冲突。执行完redefine
之后,如果再执行上面提到的命令,则会把redefine
的字节码重置。- 原因是JDK本身redefine和retransform是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。
那么新增加的 retransform
命令和 watch
/trace
命令等是同一机制下实现的。如果对同一个类执行多个命令,则会经过下面的处理:
retransform 命令 -> watch 命令 -> trace命令
所以,我们可以看到,retransform 命令执行后,不会影响watch
/trace
命令。
retransform 使用参考
加载外部的
.class
文件,retransform jvm已加载的类。
retransform /tmp/Test.class
retransform -l
retransform -d 1 # delete retransform entry
retransform --deleteAll # delete all retransform entries
retransform --classPattern demo.* # triger retransform classes
retransform -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class
retransform --classLoaderClass 'sun.misc.Launcher$AppClassLoader' /tmp/Test.class
retransform 结合 jad/mc 命令使用
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
mc /tmp/UserController.java -d /tmp
retransform /tmp/com/example/demo/arthas/user/UserController.class
- jad命令反编译,然后可以用其它编译器,比如vim来修改源码
- mc命令来内存编译修改过的代码
- 用retransform命令加载新的字节码
mc-retransform
在线教程: https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-retransform
watch 打印调用发生的具体位置
可以看到输出结果里多了location=AtExceptionExit
,location=AtExit
这样子的信息。
$ watch demo.MathGame primeFactors
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 58 ms, listenerId: 1
method=demo.MathGame.primeFactors location=AtExceptionExit
ts=2021-01-15 11:34:30; [cost=0.929596ms] result=@ArrayList[
@Object[][isEmpty=false;size=1],
@MathGame[demo.MathGame@439f5b3d],
null,
]
method=demo.MathGame.primeFactors location=AtExit
ts=2021-01-15 11:34:31; [cost=0.153708ms] result=@ArrayList[
@Object[][isEmpty=false;size=1],
@MathGame[demo.MathGame@439f5b3d],
@ArrayList[isEmpty=false;size=2],
]
watch/trace
等命令支持 --exclude-class-pattern
选项
当watch一个接口时,会匹配到它的所有实现子类,但有的时候我们排除掉一些特定的类,则比较困难,需要写很复杂的正则表达式。
所以增加了一个 --exclude-class-pattern
参数,可以很方便地排除掉不需要增强的类。
watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter
大幅改进HTTP API的稳定性
主要改进了HTTP API里json的处理,避免各种json格式化出现的问题。
总结
- retransform wiki: https://arthas.aliyun.com/doc/retransform.html
- Release 日志: https://github.com/alibaba/arthas/releases/tag/arthas-all-3.4.6
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 全新版本网易云音乐来啦
- Arthas 3.4.6 版本发布,全新版本的热更新功能
- jemalloc 5.0.0 全新版本发布,内存分配管理
- 重大版本更新,Jboot v3.5.0 全新发布
- 安全的全新V语言发布首个可用版本
- 禅道发布 15 版本第一个版本,内置项目集和管理模型概念,全新导航体系
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。