1、arthas 用法示例(1):
github.com/alibaba/art… 通过 Arthas Trace 命令将接口性能优化十倍
从中学习了 trace+tt 的用法
(1)其中 trace 可以参看某个方法的耗时
todo: 可以将耗时信息 多循环执行几层,这样可以一下分析出 某个方法中具体哪个方法是耗时最长的
(2)tt 可以参看某个方法 输入、输出,也可以直接重复执行某次请求
2、arthas 用法示例2:
github.com/alibaba/art… arthas 定位 多线程WeakHashMap引起的死循环cpu跑满问题
从中学到了 thread 跟 sc 的用法。
(1)其中 thread 可以查看线程状态。
thead -n 3
可以查看前3名消耗 cpu 的线程
thread --state TIMED_WAITING 可以查看某个状态的线程,然后 执行 thread 17 (17 为具体的线程 id) 来查看这个线程的详细堆栈
(2)sc 可以查看某个特定的类信息,以及其字段信息。也可以用来排查当前类来自哪个 jar, 用于解决 jar 冲突问题。
sc -d xxxx 其中 xxx 为具体的类
比如: sc -d com.ushareit.gaia.offline_pkg.controller.ApiController
sc -d xxx -f 可以查看类的field
3、“举报”阿里巴巴 Arthas,大幅降低 OOM Trouble shooting 门槛
4、在线修改日志级别:
arthas.aliyun.com/doc/logger.…
logger -c 2a139a55 --name ROOT --level debug
其中 2a139a55 为 classLoader 的 hash
可以通过 sc -d com.shareit.gaia.cicd.controller.TestController 来获取
—name 是 Logger 的 name.
比如 如下 logger 中的 root . 具体可以通过 logger 来查看 name 一栏。
<Loggers>
<Root level="info" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="CommonError"/>
<AppenderRef ref="Async"/>
</Root>
</Loggers>
注意:
除了 logger 的级别改了,必须 logger 的 appender 也支持对应级别才行。比如想打印 debug 日志,
需要 root 下的 Console, CommonError,Async 三个 appender 支持 debug 级别才行。如果 appender 都不支持,则也不能打印日志。
还有一种解决方案:
appender 只是一个输出管道,不要在 appender 中设置级别,而是通过 logger 整体控制。或者将 appender 的级别调低一些,logger 对象级别稍微高一些,这样 logger 可以通过 arthas 调高或者调低了。
这儿也有一个日志不生效 的案例: <https://github.com/alibaba/arthas/issues/1470>
5、 热更新代码
从中学习一下 jad / mc/redefine/retransform 命令
# 反编译$ jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
# 修改文件$ vim /tmp/UserController.java
# 查找加载的 ClassLoader$ $ sc -d *UserController | grep classLoaderHash classLoaderHash
6bc28484
# 编译$ mc -c 6bc28484 /tmp/UserController.java -d /tmp
# 热更新$ redefine /tmp/com/example/demo/arthas/user/UserController.class
redefine success, size: 1
# 热更新使用 retransform 也可以
retransform /tmp/com/example/demo/arthas/user/UserController.class
6、watch 查看某个请求参数的请求
7、stack 的使用案例
stack 可以看方法的 调用路径(查看过程中可以根据OGNL 条件表达式 ,或者 执行时间 查询)比如 :
stack demo.MathGame primeFactors 'params[0]<0' -n 2
或者
stack demo.MathGame primeFactors '#cost>5’
8 调用 复杂链路分析
arthas + jprofiler
8、【需要细化】线上问题的排查案例:
9、【需要细化】线上问题的排查案例2:
10、arthas 的8个问题
jishuin.proginn.com/p/763bfbd6d…
11、arthas 查看某个类的静态属性
-c 是指定的类加载器的 hash. 可以通过 sc -d 来获取。
ognl -c 35f983a6 '@com.shareit.gaia.cicd.controller.build.BuildCallbackController@JENKINS_USER'
arthas 可以直接调用类静态属性、类静态方法、也可以读取类中不同类型的值
<https://blog.csdn.net/u010634066/article/details/101013479> 具体的使用案例
<https://github.com/alibaba/arthas/issues/569> 这儿还有一个使用案例。