Loading... ## dump <div class="tip inlineBlock info"> 将已加载类的字节码文件保存到特定目录:logs/arthas/classdump/ </div> ```yaml # 把String类的字节码文件保存到~/logs/arthas/classdump/目录下 dump java.lang.String # 把club.ganboy包下所有的类的字节码文件保存到~/logs/arthas/classdump/目录下 dump club.ganboy.* ``` ### 小结 > dump作用:将正在JVM中运行的程序的字节码文件提取出来,保存在logs相应的目录下<br> > 不同的类加载器放在不同的目录下 ## classloader <div class="tip inlineBlock info"> 获取类加载器的信息 </div> <div class="tip inlineBlock success"> 1. classloader 命令将 JVM 中所有的classloader的信息统计出来,并可以展示继承树,urls等。 2. 可以让指定的classloader去getResources,打印出所有查找到的resources的url。对于 ResourceNotFoundException 异常比较有用。 </div> **参数说明** <table border="1"> <tr> <td bgcolor=#D9F9D5>参数名称</td> <td bgcolor=#D9F9D5>参数说明</td> </tr> <tr> <td>[l]</td> <td>按类加载实例进行统计</td> </tr> <tr> <td>[t]</td> <td>打印所有ClassLoader的继承树</td> </tr> <tr> <td>[a]</td> <td>列出所有ClassLoader加载的类,请谨慎使用</td> </tr> <tr> <td>[c:]</td> <td>ClassLoader的hashcode</td> </tr> <tr> <td>[c: r:]</td> <td>用ClassLoader去查找resource</td> </tr> <tr> <td>[c: load:]</td> <td>用ClassLoader去加载指定的类</td> </tr> </table> ```yaml # 默认按类加载器的类型查看统计信息 classloader # 按类加载器的实例查看统计信息,可以看到类加载的hashCode classloader -l ``` ![classloader][1] ![classloader -l][2] ## tt(重要) <div class="tip inlineBlock info"> - time-tunnel 时间隧道 - 记录下指定方法每次调用的入参和返回信息,并能对这些不同时间下调用的信息进行观测 </div> > watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。<br><br>这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。<br> <table border="1"> <tr> <td bgcolor=#D9F9D5>参数名称</td> <td bgcolor=#D9F9D5>参数说明</td> </tr> <tr> <td>-t</td> <td>记录某个方法在一个时间段中的调用</td> </tr> <tr> <td>-l</td> <td>显示所有已经记录的列表</td> </tr> <tr> <td>-n 次数</td> <td>只记录多少次</td> </tr> <tr> <td>-s 表达式</td> <td>搜索表达式</td> </tr> <tr> <td>-i 索引号</td> <td>查看指定索引号的详细调用信息</td> </tr> <tr> <td>-p</td> <td>重新调用指定的索引号时间碎片</td> </tr> </table> <div class="tip inlineBlock error"> 当你执行一个调用量不高的方法时可能你还能有足够的时间用 CTRL+C 中断 tt 命令记录的过程, 但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。<br> 此时你可以通过 -n 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的 记录过程,避免人工操作无法停止的情况。 </div> ```yaml # 最基本的使用来说,就是记录下当前方法的每次调用环境现场。 tt -t club.ganbloy.controller.TianApiController getEverydayEnglish ``` ![tt -t 示例][3] <table border="1"> <tr> <td bgcolor=#D9F9D5>表格字段</td> <td bgcolor=#D9F9D5>字段解释</td> </tr> <tr> <td>INDEX</td> <td>时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于 此编号指定记录操作,非常重要。</td> </tr> <tr> <td>TIMESTAMP</td> <td>方法执行的本机时间,记录了这个时间片段所发生的本机时间</td> </tr> <tr> <td>COST(ms)</td> <td>方法执行的耗时</td> </tr> <tr> <td>IS-RET</td> <td>方法是否以正常返回的形式结束</td> </tr> <tr> <td>IS-EXP</td> <td>方法是否以抛异常的形式结束</td> </tr> <tr> <td>OBJECT</td> <td>执行对象的 hashCode()</td> </tr> <tr> <td>CLASS</td> <td>执行的类名</td> </tr> <tr> <td>METHOD</td> <td>执行的方法名</td> </tr> </table> <div class="tip inlineBlock error"> - 解决方法重载 > tt -t *Test print params.length==1<br><br>通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写<br><br>tt -t *Test print 'params[1] instanceof Integer' - 解决指定参数 > tt -t *Test print params[0].mobile=="13989838402" </div> ### 查看调用信息 <div class="tip inlineBlock share"> 对于具体一个时间片的信息而言,你可以通过 -i 参数后边跟着对应的 INDEX 编号查看到他的详细信 息。 </div> ```shell tt -i 1000 ``` ### 重做一次调用 > 当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时得求爷爷告奶奶的需要前端配合联调的同再次发起一次调用。而有些场景下,这个调用不是这么好触发的。<br>tt 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 INDEX 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 -p 参数。通过 --replay-times 指定 调用次数,通过 --replay-interval 指定多次调用间隔(单位ms, 默认1000ms) ```shell tt -i 1000 -p ``` ## profiler火焰图 <div class="tip inlineBlock info"> profiler 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成 火焰图。 命令基本运行结构是 profiler 命令 [命令参数] </div> ### 启动profiler ```yaml # 默认情况下,生成的是cpu的火焰图,即event为 cpu 。可以用 --event 参数来指定 $ profiler start ``` ### 常用命令 ```yaml # 显示支持的事件 profiler list # 获取已采集的sample的数量 profiler getSamples # 查看profiler状态 可以查看当前profiler在采样哪种 event 和采样时间 profiler status # 停止profiler生成svg结果 profiler stop # 默认情况下,生成的结果保存到应用的 工作目录 下的 arthas-output 目录。可以通过 --file 参数来指 定输出结果路径。比如: profiler stop --file /tmp/output.svg # 生成html格式结果 profiler stop --format html ``` [1]: https://cdn.ganhua.work/blog_static/images/2021/01/classloader.png [2]: https://cdn.ganhua.work/blog_static/images/2021/01/classloader-l.png [3]: https://cdn.ganhua.work/blog_static/images/2021/01/tt.png 最后修改:2021 年 10 月 18 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 社会很单纯~复杂滴是人呐~谁能在乎我呀