可以使用arthas的watch命令来诊断。 测试程序: /** * Hello world! * */ public class App { private List<Integer> p = new ArrayList<Integer>(); private static int num = 0; private List<Data> get(){ p.add(0, num++); Data data1 = new Data(); data1.map.put("key1", 1); data1...
watch命令:便于观察指定方法的调用情况。具体地,可以观察到:方法入参、方法返回值、方法抛出异常。 我们同样以上面的示例来演示下watch命令的使用。 因为我们只要要看到方法colourCheck和packageCheck的返回值,就可以找到问题所在。 我们先看colourCheck(颜色检查) 方法 命令如下 watch com.zhuangpo.event.service.impl....
private static boolean subCondition() { //复杂逻辑 return false; } /** * 存储线程流水映射 */ private static final ConcurrentHashMap<Long,Integer> flowMap = new ConcurrentHashMap<>(10); /** * 根据当前线程id获取流水 * @return flow 流水值 */ private static int getFlow(){ return flowMap...
我们通过「-b选项」观察TestWatch中calc方法被调用时的方法入参,同时指定观察表达式「{params,target,returnObj}」,其中params、target、returnObj分别表示入参、调用类的实例、返回值。「-x选项」则用于指定对输出结果中属性遍历的深度,默认为1,最大为4 # 通过-b选项观察TestWatch中calc方法被调用时的方法入参 wa...
*/privatestaticvoidsetFlow(intflow){flowMap.put(Thread.currentThread().getId(),flow);}} 2.观测的目标 getPrefix(boolean supportHttps)方法被调用时,supportHttps的值,到底是true还是false呢? 二、观测&排查流程 1.直接watch观测getPrefix()方法,拿到参数值 ...
示例方法 复制 publicvoid methodForWatch(intid,Useruser) {} 1. 2. User 结构 复制 @DatapublicclassUser{private Stringname;privateintage;private List<String> hobbies;} 1. 2. 3. 4. 5. 6. 另外准备一些请求,我会在每个示例中执行相同的调用。示例请求: ...
monitor——方法执行监控 watch——方法执行数据观测 trace——方法内部调用路径,并输出方法路径上的每个节点上耗时 stack——输出当前方法被调用的调用路径 tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测 请注意,这些命令,都通过字节码增强技术来实现的,会...
「-f」:在方法调用结束后进行观察。显然该选项即会观察到方法抛出异常的情形,也会观察到方法正常返回的情形。除了该选项默认打开外,上述3个选项均默认关闭 为了便于演示,提供下述测试代码 package com.aaron.Arthas;import org.junit.Test;import java.util.Random;publicclassTestWatch{privatestaticfinal String ...
watch:方法执行的数据观测,可以通过watch指令,来监控某个类,监控后,运行下你的功能,复现下场景,arthas会提供给你具体的出参和入参,帮助你排查故障 trace 输出方法调用路径,并输出耗时,这个指令对于优化代码非常的有用,可以看出具体每个方法执行的时间,如果是for循环等重复语句,还能看出n次循环中的最大耗时,最小耗时...
首先,通过 dashboard + thread 命令,基本可以在几秒钟内一键定位问题,找出消耗 CPU 最多的线程和方法栈; 然后,直接 jad 反编译相关代码,来确认根因; 此外,如果调用入参不明确的话,可以使用 watch 观察方法入参,并根据方法执行时间来过滤慢请求的入参。