首页 国际新闻正文

月光光心慌慌,火眼金睛,Java确诊利器Arthas,丘吉尔

1 简介

Arthas 是Alibaba开源的J招标秘书ava确诊东西,深受开发者喜欢

当你遇到以下类似问题而束手无策时,A牛鬣兽rthas能够协助你处理:

  • 这个类从哪个 jar 包加载的?为什么会报各品种相关的 Exception?
  • 我改的代码为什么没有履行到?莫非是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,莫非只能经过加日志王全友再从头发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上相同无法 debug,线下无法重现!
  • 是否有一个大局视角来检查体系的运转状况?
  • 有什么办法能够监控到JVM的实时运转状况?

Arthas支撑JDK 6+,支撑Linux/Mac/Winodws,选用指令行交互形式,一起供给丰厚的 Tab 主动补全功用,进一步便利进行问题的定位和确诊

2 首要功许念游天恒能

Arthas供给的功用首要能够分为以下3个方面:

  • (1) 信息监控
  • 进程运转基本信息:内存、CPU占用、线程信息、线程仓库、线程数计算、环境变量信息
  • 目标信息:类目标静态特点、 Mbean 的特点信息、已加载类信息、类加载器、类办法信息
  • (2) 办法调用
  • 办法调用入参、回来值检查
  • 办法被调用的调用途径、调用耗时、办法调用次数、成功次数、失利次数等计算
  • 记载和重做办法调用
  • (3) 类文件处理
  • dump已加载类的字节码、字节码反编译、类编译、类从头热加载

3 装置和运用

3.1 装置

下载arthas-boot.jar,然后用java -jar的办法发动:

wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

然后输入进程对应编号,进入Arthas的指令交互界面即可运用:

打印协助信息:

java -jar arthas-boot.jar -h

3.2 运用

下面介绍Arthas的一些常用的指令和用法和原理,看看是怎么处理咱们实践中的问题的,指令概况能够参阅Arthas的官方文档

(1) 全体dashboard数据

在arthas的指令行界面,输入dashboard指令,会实时展现当时tomcat的多线程状况、JVM各区域、GC状况等信息

(2) 检查线程监控

输入thread指令,会显现一切线程的状况信息输入thread -n 3会显现当时最忙的3个线程,能够用来排查线程CPU耗费输入thread -b 会显现当时处于BLOCKED状况的线程,能够排查线程锁的问题

(3) JVM监控

输入jvm指令,检查jvm详细的功用数据

(4) 调查办法参数、回来值

有时排查问题中咱们需求检查参数,回来值,一般的需求加日志打印,比较繁琐,根据watch指令咱们能够很便利做到这一切

$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 44 ms.
ts=2018-12-03 19:16:51; [cost=1.280502ms] result=@ArrayLi刁蛮公主撞上蛮横王子st[
@Object[][
@Integer[5356295月光光心慌慌,火眼金睛,Java确诊利器Arthas,丘吉尔13],
],
@ArrayList[
@Integer[3],
@Integer[19],
@Integer[191],
@Integer[49199],
],
]

(5) 调查办法调用途径,耗时概况

有时会遇到服务卡顿,想排查究竟哪个过程耗时比较久,一般做法是加日志,运用月光光心慌慌,火眼金睛,Java确诊利器Arthas,丘吉尔trac月光光心慌慌,火眼金睛,Java确诊利器Arthas,丘吉尔e指令能够祥元通宝很便利处理这个问题:

$ trace demo.MathGame run
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 42 ms.
`---ts=2018-12-04 00:44:17;thread_name=main;id=日本无翼鸟少女漫画1;is_daemon=false;priority月光光心慌慌,火眼金睛,Java确诊利器Arthas,丘吉尔=5;TCCL=sun.misc.Launcher月光光心慌慌,火眼金睛,Java确诊利器Arthas,丘吉尔$AppClassLoader@3d4eac69
`---[10.611029ms] demo.MathGame:run()
+---[0.05638ms] java.月光光心慌慌,火眼金睛,Java确诊利器Arthas,丘吉尔util.Random:nextInt()
+---[10.036885ms] demo.MathGame:primeFactors()
`---[0.170316ms] demo.MathGame:print()

4 完成原理

全体微观模块调用图如下:

篇幅原因,下面临其庶女阏氏其间触及的比较中心的2个原理进行简略介绍:

(1) 信息监控、类文件处理

JDK供给的JMX(Java Manageme成渝钒钛科技有限公司nt Extensions Java办理扩展,是一个为运用程序植入办理功用的结构),JMX办理办理了一系列MBean目标,Arthas正是根据这些MBean目标完成内存、GC、类加载信息、JVM信息监控

(2) 办法调用

从JDK5之后,引入了java.lang.Instrument,程序员经过修塞进改办法的字节码完成动态修正类代码。在署理类的办法中的参数中,就有Instrumentati户太十号on inst实例。经过该实例,咱们能够调用Instrumentation供给的各种接口。比方调用inst.getAllLoadedClasses()得到一切现已加载过的类。调用inst.addTransformer(new SdlTransformer(), true)新增转化器。调用inst.retransformClasses(Class cls),向JVM发起重转化恳求

Arthas运用ASM生成增强后的类的字节码,增强的功用包含办法调用入参、回来值检查、办法调用统傲卡名车计、办法调用记载和重做,再根据JDK供给的Instrumentation接口对办法进行添加和转化

5 实战事例

Arthas官方文档供给了许多用户事例,下面介绍几个比较有意思的事例:

(1) 排查运用古怪日志来历

https://github.creal423om/alibaba/arthas/issues/263服务运用运转中有时会呈现一些古怪日志,排查定位这些日志的来历比较费事经过修正StringBuilder的完成代码打印出日志的调用仓库信息,编译生成StringBuilder.clss,再根据Arthas供给的rede罗娟简历fine命山东琴书刘世福专辑令修正运用中运用的StringBuilder的实践运用字节码

(2) 排查SpringBoot应舞岛用401/404问题

https://github.com/alibaba/arthas月光光心慌慌,火眼金睛,Java确诊利器Arthas,丘吉尔/issues/429页面拜访回来401/404,碰到这种问题时,一般很头痛,特别是在线上环境时经过Arthas供给的trace指令,打印出页面拜访时的完好恳求树,定位出详细哪个Servlet回来404

$ trace javax.servlet.Servlet *
Press Ctrl+C to abort.
Affect(class-cnt:7 , method-cnt:185) c费雯・丽ost in 1018 ms.

经过trace指令,trace目标是javax.servlet.Filter定位详细哪个Filter阻拦恳求定位回来401的问题来历

$ trace javax.servlet.Filter *
Press Ctrl+C to abort.
Affect(class-cnt:13 , method-cnt:75) cost in 278 ms.

(3) 线上代码热更新

https://github.com/alibaba/arthas/issues/537有时为了快速验证线上问题的修正计划,或许为了快速测验,咱们需求热更新代码Arthas供给的处理过程如下

  • 过程1 jad指令反编译代码
  • 过程2 文本编辑器修正代码
  • 过程3 sc指令查找代码地点类的C张嘉良lassLoader
  • 过程4 mc指令指定ClassLoader编译代码
  • 过程5 redefine指令热更新代码

参阅

https://alibaba.github.io/a八木优希rthas/

https://alibaba.github.io/arthas/quick-start.html

https://blog.csdn.net/zl1zl2zl3/article/details/89333004

https://mp.weixin.qq.com/s/wG51oUqVPObACqvZA9ItOg

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。