新闻资讯
火眼金睛,Java诊断利器Arthas
发布时间:2022-07-15 00:05
  |  
阅读量:
字号:
A+ A- A
本文摘要:1 简介Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱当你遇到以下类似问题而束手无策时,Arthas可以资助你解决:这个类从哪个 jar 包加载的?为什么会报种种类相关的 Exception?我改的代码为什么没有执行到?岂非是我没 commit?分支搞错了?遇到问题无法在线上 debug,岂非只能通过加日志再重新公布吗?线上遇到某个用户的数据处置惩罚有问题,但线上同样无法 debug,线下无法重现!是否有一个全局视角来检察系统的运行状况?

AOA体育官网

1 简介Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱当你遇到以下类似问题而束手无策时,Arthas可以资助你解决:这个类从哪个 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.jarjava -jar arthas-boot.jar然后输入历程对应编号,进入Arthas的下令交互界面即可使用:打印资助信息:java -jar arthas-boot.jar -h3.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 2Press 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=@ArrayList[ @Object[][ @Integer[535629513], ], @ArrayList[ @Integer[3], @Integer[19], @Integer[191], @Integer[49199], ],](5) 视察方法挪用路径,耗时详情有时会遇到服务卡顿,想排查到底哪个步骤耗时比力久,通常做法是加日志,使用trace下令可以很利便解决这个问题:$ trace demo.MathGame runPress 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=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 `---[10.611029ms] demo.MathGame:run() +---[0.05638ms] java.util.Random:nextInt() +---[10.036885ms] demo.MathGame:primeFactors() `---[0.170316ms] demo.MathGame:print()4 实现原理整体宏观模块挪用图如下:篇幅原因,下面临其其中涉及的比力焦点的2个原理举行简朴先容:(1) 信息监控、类文件处置惩罚JDK提供的JMX(Java Management Extensions Java治理扩展,是一个为应用法式植入治理功效的框架),JMX治理治理了一系列MBean工具,Arthas正是基于这些MBean工具实现内存、GC、类加载信息、JVM信息监控(2) 方法挪用从JDK5之后,引入了java.lang.Instrument,法式员通过修改方法的字节码实现动态修改类代码。在署理类的方法中的参数中,就有Instrumentation inst实例。

通过该实例,我们可以挪用Instrumentation提供的种种接口。好比挪用inst.getAllLoadedClasses()获得所有已经加载过的类。

挪用inst.addTransformer(new SdlTransformer(), true)新增转换器。挪用inst.retransformClasses(Class cls),向JVM提倡重转换请求Arthas使用ASM生成增强后的类的字节码,增强的功效包罗方法挪用入参、返回值检察、方法挪用统计、方法挪用记载和重做,再基于JDK提供的Instrumentation接口对方法举行增加和转换5 实战案例Arthas官方文档提供了许多用户案例,下面先容几个比力有意思的案例:(1) 排查应用奇怪日志泉源https://github.com/alibaba/arthas/issues/263服务应用运行中有时会泛起一些奇怪日志,排查定位这些日志的泉源比力贫苦通过修改StringBuilder的实现代码打印出日志的挪用客栈信息,编译生成StringBuilder.clss,再基于Arthas提供的redefine下令修改应用中使用的StringBuilder的实际使用字节码(2) 排查SpringBoot应用401/404问题https://github.com/alibaba/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) cost 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下令查找代码所在类的ClassLoader步骤4 mc下令指定ClassLoader编译代码步骤5 redefine下令热更新代码参考https://alibaba.github.io/arthas/https://alibaba.github.io/arthas/quick-start.htmlhttps://blog.csdn.net/zl1zl2zl3/article/details/89333004https://mp.weixin.qq.com/s/wG51oUqVPObACqvZA9ItOg更多精彩,接待关注民众号【漫衍式系统架构】。


本文关键词:火眼金睛,Java,诊断,利器,Arthas,简介,Arthas,是,AOA体育官网

本文来源:AOA官方入口-www.yd-idea.com