空心|记 Arthas 实现一次 CPU 排查与代码热更新( 二 )
这个脚本可以检测一切通过 DispatcherServlet 匹配 Handler 的方法 , 也就是进入 Controller 的请求 , 如下:
找到了对应的代码之后 , 我们来进一步观察异常信息 , 这里可能会有一个问题:就是我明明能通过日志去查看错误信息 , 为什么还需要这么繁琐的去操作 。 我的业务场景是:日志还是非常大的 , 刚捞到就被刷过去了 , 这时候定位日志不是很好操作 , 当然想捞下来日志肯定也是可以的 , 也很直观 , 我一般也都是去查看日志进行问题定位 , 这里也是提供一个思路 。
6.watch 该方法异常信息watch 类全路径 方法名 "{params[0],throwExp}" -e -x 2
如上 , 错误很直观的提示了出来 , 下面就可以修复解决了 , 这里我们也可以通过 trace 指令 , 查看执行时长:
trace 类全路径 方法名 "{params[0],throwExp}" -e -x 2
返回信息如下 , 也可以看到错误信息 , 和每个方法执行的时长 。
[arthas@10999]$ trace com.arthas.controller.OrderController bigThreadPress Q or Ctrl+C to abort.Affect(class count: 1 , method count: 1) cost in 53 ms, listenerId: 10`---ts=2020-08-19 14:45:57;thread_name=http-nio-0.0.0.0-8080-exec-10;id=16;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6`---[1452.684406ms] com.arthas.controller.OrderController:bigThread() [throws Exception]+---[0.168814ms] com.arthas.service.ArthasService:test() #20`---throw:java.lang.OutOfMemoryError #-2 [unable to create new native thread]
7.jad 反编译热更新在上面知道问题之后 , 我们就来定位问题就好了 。
命令:jad 类全路径 方法名
[arthas@13190]$ jad com.arthas.controller.OrderControllerClassLoader:+-org.springframework.boot.loader.LaunchedURLClassLoader@17f052a3+-sun.misc.Launcher$AppClassLoader@3d4eac69+-sun.misc.Launcher$ExtClassLoader@45f45fa1Location:file:/opt/software/arthas/Arthas.jar!/BOOT-INF/classes!//* * Decompiled with CFR. ** Could not load the following classes: *com.arthas.service.ArthasService *org.springframework.stereotype.Controller *org.springframework.web.bind.annotation.RequestMapping *org.springframework.web.bind.annotation.ResponseBody */package com.arthas.controller;import com.arthas.service.ArthasService;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class OrderController {@RequestMapping(value=http://kandian.youth.cn/index/{"/bigThread"})@ResponseBodypublic String bigThread(int id) {ArthasService.test();do {Thread t2 = new Thread();t2.start();} while (100000 != ++id);return String.valueOf(id);}}Affect(row-cnt:1) cost in 1513 ms.
此时代码就被反编译了 , 为了能够更改 , 所以我们需要输出为 java 文件 。
指令:jad com.arthas.controller.OrderController > /tmp/OrderController.java
推荐阅读
- 第一财经|8月外储实现五连升,双循环格局将继续支持规模总体稳定
- 【】前8个月我国外贸总值突破20万亿元 出口首次实现年内正增长
- 央视新闻客户端|前8月我国外贸总值突破20万亿 出口首次实现年内正增长
- 人民币|8月外储实现五连升,双循环格局将继续支持规模总体稳定
- 一味宠爱|最全盘点卡中国脖子的35项技术,折射中国工业水平的真实现状
- 上海宝山|实现加装电梯“零突破”!,罗店这个小区这样做
- 央视新闻客户端|前8个月我国外贸总值突破20万亿元 出口首次实现年内正增长
- 科内|意大利超级杯结束!科内实现3连冠,诺瓦拉全新阵容令人失望
- 智能垃圾分类小屋亮相服贸会 可实现一站式垃圾分类
- |《病患悖论》关注“过度医疗” 实现健康不是靠更多的医药