Java线上问题排查剑Arthas实战分析
平江娱乐新闻网 2025-09-16
SpringBoot激活类
package cn.itxs;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class App { public static void main(String[] args) { SpringApplication.run(App.class,args); }}# 访问主页# 仪表盘立即,通过上头我们可以推断单单中央驱动程序ID为29也即是中央驱动程序重新命名为“cpu demo thread”空置的cpu较差dashboard 第一外时看单单JVM中所试运行的所有中央驱动程序:所因特网程组,优先行级,中央驱动程序的完均,CPU的占有率,是否是前台机制在等。第二外看单单的JVM文件系统的特指完均一致情况和GC的反馈。第三外是UNIX的一些反馈和 Java正式版。# 近期最忙的前N个中央驱动程序 thread -b, ##找单单近期阻塞其他中央驱动程序的中央驱动程序 thread -n 5 -i 1000 #较宽一定短时间后展示,举例来说中所可以看不到最忙CPU中央驱动程序为id=45,字符数为19thread -n 5 # jad查询反编译器的字符jad cn.itxs.controller.CpuController 中央驱动程序死锁下述package cn.itxs.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@RestController@RequestMapping("/thread")public class ThreadController { private Object obj1 = new Object(); private Object obj2 = new Object(); @RequestMapping("/test") @ResponseBody public String test(){ new Thread(() -> { synchronized (obj1){ try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { } synchronized (obj2){ System.out.println("thread 1督导到此"); } } },"thread 1").start(); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(() -> { synchronized (obj2) { synchronized (obj1){ System.out.println("thread 2督导到此"); } } },"thread 2").start(); return "thread test"; }}# 激活SpringBoot示范机制,访问主页# 试运行arthas,查询中央驱动程序thread# 查询阻塞中央驱动程序thread -b# jad反编译器查询字符jad ;还有source-only cn.itxs.controller.ThreadController 中央线上修复圣万桑地面部队准备一个有疑问的java类
package cn.itxs.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import java.util.UUID;import java.util.concurrent.TimeUnit;@RestController@RequestMapping("/hot")public class HotController { @RequestMapping("/test") @ResponseBody public String test(){ boolean flag = true; if (flag) { System.out.println("开始管控自然语言"); throw new RuntimeException("单单单单现异常了"); } System.out.println("完结程序中"); return "hot test"; }}激活Spring Boot机制,访问主页推断单单报错,当我们数据分析到这段机制单单单单现异常后,我们数据分析单单现异常后顺利进行中央线上字符重写不停机不继续发包被的情形的圣万桑改版,操控程序中如下:
# 第一步:在在jad立即在在 将必需更改的元数据先行顺利进行反编译器,保存下去 ,编译器器重写,-c 自行决定这个类的classloader的哈希差值,–source-only只看单单源码,最后是元数据反编译器之后的存放方向jad ;还有source-only cn.itxs.controller.HotController> /home/commons/arthas/data/HotController.java# 我们将HotController.java中所的throw new RuntimeException("单单单单现异常了")字符删去,重写完后必需将类继续加在载到JVM# 第二步:在在SC立即在在 匹配近期类是哪个classLoader加在载的,首先行,特指sc立即找到要重写的类.sc均称-search class, -d对此detail,主要是为了给予classLoader的Hash差值sc -d *HotController | grep classLoaderclassLoaderHash 6267c3bb #类加在载器 序号 # 第三步:在在MC立即在在 用自行决定的classloader继续将类在文件系统中所编译器mc -c 6267c3bb /home/commons/arthas/data/HotController.java -d /home/commons/arthas/class# 第四步:在在redefine立即在在 将编译器后的类加在载到JVM,数差值是编译器后的.class元数据电话号码redefine /home/commons/arthas/class/cn/itxs/controller/HotController.class以上操控后再次访问一下主页,推断单单单单现异常没法有人了机制已经是我们重写正确后的,class元数据替换成功,动态确实很庞大。
上头我们是木工一步步督导,当然我们可以特指shell脚本串慢慢地直观操控。
此外还可以装配Alibaba Cloud Toolkit圣万桑地面部队组件(一键retransform),圣万桑地面部队组件大力支持一键将编辑器中所重写的 Java 源码迅速编译器,并改版到用户端基础架构中所,撤职手动 dump、mc 的过程。此外,也可以一键催化 retransform 的类元数据。
由于Arthas立即还是较复杂,Arthas-ideaJavaScript(外立即仿真)是一个设法分解成立即的IDEAJavaScript,特指文档:;
装配基于Arthas发挥作用的直观好用的圣万桑地面部队JavaScriptArthasHotSwap可以一键分解成圣万桑地面部队立即,提很低我们中央线上维护的稳定性。
中央线上疑问典型导向watch(作法督导反馈观测)package cn.itxs.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.List;import java.util.Random;@RestController@RequestMapping("/watch")public class WatchController { private static Random random = new Random(); private int illegalArgumentCount = 0; @RequestMapping("/test") @ResponseBody public String test(){ String res = null; try { int number = random.nextInt() / 10000; List idStrs = this.getIdStr(number); res = printList(number, idStrs); } catch (Exception e) { System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage()); } return res; } private List getIdStr(int number) { if (number < 5) { ++this.illegalArgumentCount; throw new IllegalArgumentException("number is: " + number + ", need>= 5"); } ArrayList result = new ArrayList(); int count = 2; while (count <= number) { if (number % count == 0) { result.add(count); number /= count; count = 2; continue; } ++count; } return result; } private String printList(int number, List primeFactors) { StringBuffer sb = new StringBuffer(number + "="); for (int factor : primeFactors) { sb.append(factor).append('*'); } if (sb.charAt(sb.length() - 1) == '*') { sb.deleteCharAt(sb.length() - 1); } System.out.println(sb); return sb.toString(); }}激活Spring Boot机制,通过Jmeter流量访问一次
# Arthas中所的**watch**立即可以让我们能方便的判读到自行决定作法的绑定完均一致情况,可以判读到std,先入参,以及参数等。# watch 均方向类名 作法名 判读运算符 -x 3 ,判读运算符反之亦然ognl运算符,判读的也就是说也比较多。# 比如:watch cn.itxs.controller.WatchController printList "{params,returnObj}" -x 3# 查询printList作法的先入参和单单参,-x对此的是遍历结果深度选项1,只都会打印取向的地里面电话号码,看不到完均一致的属性差值,-x 2都会打印结果的属性差值的反馈 -x 3都会输相通参属性差值和结果属性差值# -n 1只抓住一次,由于我们这里面是模拟长期以来请求的watch cn.itxs.controller.WatchController printList '{params}' -n 1# -x 对此的是遍历结果深度选项3watch cn.itxs.controller.WatchController printList '{params}' -n 1 -x 3# params[0]代表人第一个数差值watch cn.itxs.controller.WatchController printList '{params[0]}' -n 1 -x 3 # 作法的stdwatch cn.itxs.controller.WatchController getIdStr '{returnObj}' -n 1 -x 3# 作法数差值和stdwatch cn.itxs.controller.WatchController getIdStr '{params,returnObj}' -n 1 -x 3 # 判读作法督导前后近期取向属性差值watch cn.itxs.controller.WatchController getIdStr 'target.illegalArgumentCount' # 判读单单现异常反馈,判读运算符里面增大在throwExp就好了。如果增大在-e 数差值就能屏蔽掉非单单现异常的通话了。 # 在判读运算符末尾,我们可以增大在有条件运算符,例如按短时间屏蔽:#cost>0.5,一个单位是毫秒,那么遏制台负载来的都是花费在0.5毫秒以上的作法绑定watch cn.itxs.controller.WatchController getIdStr '{params}' '#cost>0.5' # 按有条件屏蔽判读params[1].size>4:这里面大力支持ognl运算符。下面举例的意思是:第二个数差值(也就是List primeFactors),的size大于4的时候才判读先入参。watch cn.itxs.controller.WatchController printList '{params}' 'params[1].size>4' -x 3 monitor(作法督导管控)monitor结果包被括如下
**timestamp:短时间戳 **class:Java类method:作法(构造作法、普通作法)total:绑定至多success:成功至多fail:失败至多rt:平均RTfail-rate:失败率# -c :汇总周期,选项差值为10秒monitor -c 10 cn.itxs.controller.WatchController getIdStr# 在作法绑定之前计可知condition-express,作法后可带运算符monitor -b -c 10 cn.itxs.controller.WatchController getIdStr trace# trace:作法也就是说上绑定方向,并负载作法方向上的每个节点上花费trace cn.itxs.controller.WatchController test -n 2#包被含jdk的函数;还有skipJDKMethod skip jdk method trace, default value true.选项情形,trace不都会包被含jdk里面的函数绑定,如果期望trace jdk里面的函数,必需显式设置;还有skipJDKMethod false。trace ;还有skipJDKMethod false cn.itxs.controller.WatchController test -n 2# 绑定花费屏蔽,只都会展示花费大于10ms的绑定方向,有助于在查处疑问的时候,只关注单单现异常完均一致情况trace cn.itxs.controller.WatchController test '#cost> 1' stack# 负载近期作法被绑定的绑定方向,getIdStr是从test作法绑定进去的stack cn.itxs.controller.WatchController getIdStr -n 1# 负载近期作法被绑定的绑定方向,有条件表达屏蔽,第0个数差值大于0,也可以根据督导短时间来屏蔽,'#cost>1'stack cn.itxs.controller.WatchController getIdStr 'params[0]<0' -n 1 tttt(TimeTunnel):作法督导反馈的时空很低架桥,详细描述下自行决定作法每次绑定的先入参和赶回反馈,并能对这些相同的短时间下绑定顺利进行观测。对于一个最基本的特指来说,就是详细描述下近期作法的每次绑定状况会场。
# 详细描述自行决定作法的每次绑定状况会场tt -t cn.itxs.controller.WatchController getIdStr # 列单单所有绑定详细描述tt -l cn.itxs.controller.WatchController getIdStr # 筛选绑定详细描述tt -s 'method.name=="getIdStr"'# 查询绑定反馈tt -i 1001 # 继续发起一次绑定tt -i 1001 -p Web Console# 激活时自行决定Linux的ipjava -jar arthas-boot.jar ;还有target-ip 192.168.50.94 profilerprofiler** 立即大力支持分解成领域圣万桑点的闪光三幅。本质上是通过不断的量化,然后把收集到的量化结果分解成闪光三幅。一般数据分析性能可以先行通过Arthas profiler立即分解成**jfr元数据;在本地通过 jprofiler来数据分析 jfr元数据,导向谁在绑定我。
# 激活profiler 选项情形,分解成的是cpu的闪光三幅,即event为cpu。可以用;还有event数差值来自行决定profiler start# 给予已热带植物的sample的数量profiler getSamples# 查询profiler完均profiler status# 取消profiler 分解成html音频结果,选项情形,结果元数据是html音频,也可以用;还有format数差值自行决定;或者在;还有file数差值里面用元数据名指名音频。比如;还有file /tmp/result.htmlprofiler stop ;还有format html通过浏览器查询arthas-output下面的profiler结果,
# profiler大力支持的eventsprofiler list # 可以用;还有event数差值自行决定要量化的惨案,比如对alloc惨案进先入量化:profiler start ;还有event alloc# 特指execute来督导复杂的立即profiler execute 'start,framebuf=5000000'# 分解成 jfr音频结果;注意,jfr只大力支持在 start时装配。如果是在stop时自行决定,则不都会生效。profiler start ;还有file /tmp/test.jfr# 装配 include/exclude 来屏蔽反馈profiler start ;还有include 'java/*' ;还有include 'demo/*' ;还有exclude '*Unsafe.park*'# profiler督导 300 秒基本动态完结,可以用 -d/;还有duration 数差值自行决定profiler start ;还有duration 300 其他动态提供者Http API可以提供者示例的反馈,大力支持更复杂的交互动态,比如特定领域场景的一系列病症操控。Http API终端电话号码为:**,必须特指POST模式提交请求数差值。如POST **{ "action": "exec", "requestId": "req112", "sessionId": "94766d3c-8b39-42d3-8596-98aee3ccbefb", "consumerId": "955dbd1325334a84972b0f3ac19de4f7_2", "command": "version", "execTimeout": "10000"}docker特指,很多时候,领域在docker里面单单现arthas未工作的疑问,是因为领域没法有人装配 JDK ,而是装配了 JRE 。如果只装配了 JRE,则都会缺失很多JAVA的立即行基本动态和类库,Arthas也没法办法正常工作,可以特指引起争议的JDK终端和包被管理软件来装配这两种模式在Docker里面特指JDK。# 选择必需管控领域的机制在序号,开路后Arthas都会attach到目标机制在上,并负载日志: docker exec -it arthas-demo /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar" # 甚至我们可以直接把arthas摆在容器终端元数据中所:Arthas Spring Boot Starter:领域激活后,spring都会激活arthas,并且attach自身机制在。 com.taobao.arthas arthas-spring-boot-starter ${arthas.version} 非spring boot领域特指模式 com.taobao.arthas arthas-agent-attach ${arthas.version} com.taobao.arthas arthas-packaging ${arthas.version} import com.taobao.arthas.agent.attach.ArthasAgent; public class ArthasAttachExample { public static void main(String[] args) { ArthasAgent.attach(); }}标题来自IT小神Twitter
。常州男科检查哪些项目长沙看牛皮癣哪家比较好
成都试管婴儿正规的医院
西安妇科医院排名
天津看男科去什么医院最好
植入关键词
小腹胀
咳嗽咳痰喝哪种糖浆止咳化痰效果好
补肾药物
中风偏瘫
-
六十多岁的人怎么看母子
综艺 2025-10-23与母亲的彼此间相较,双亲和我们的彼此间显得有些“疏远”。与夫妻彼此间相较,我们双亲彼此之间的彼此间显得有些“却是”。母亲潜移默化的幸福是一种感人的亲情。兄妹彼此之间的亲情,却是虚伪。幸福人对你的
-
记事索尼即将发布FE PZ 16-35mm f/4 G镜头
八卦 2025-10-23记任天堂即将发布 FE PZ 16-35mm f4 G 摄像机,想不到的是,这是一款“PZ”电动单反相机摄像机。
-
深圳新增8例病例,在集中会隔离观察人员和主动核酸检测中会发现
写真 2025-10-232同月16日,东莞另加8例病症。其中6例为已集中强制观察的“0213”登革热病症的断续者,2例为即刻脱氧核糖核酸检测和断续者筛查中挖掘出。“0213”登革热另加6例为
-
直播预告 | 1月12日,“改进学校评价,促进有效学习”——“数据驱动职业教育教学改进”试点项目第三次会议即将开始!
星闻 2025-10-23为贯彻落实深化新时代英语教育赞赏进行改革的要求,以及省督导办和省建设厅指导部署,浙江省建设厅留校全面触发“统计数据动力英语教育教学改进工程建设”,温州、舟山2个设区内市以及杭州市上城区内、杭州市
-
玉树想“值钱”,仅靠“会修剪”,长成百年大老树,就靠3个要点
八卦 2025-10-23西康是景天科的多鸡肉豆科植物,相信很多朋友都饲过这种有用好饲的绿植。西康虽然广泛,但是胜在株型清秀精致:直立除此以外挺拔有力,根部肥厚又厚重,树叶苍劲气派并且更容易木质化,像一棵遒劲有力的古树气