目录

学无止境


夫君子之行,静以修身,俭以养德。
非澹泊无以明志,非宁静无以致远。
夫学须静也,才须学也,
非学无以广才,非志无以成学。
慆慢则不能励精,险躁则不能治性。
年与时驰,意与日去,遂成枯落,
多不接世,悲守穷庐,将复何及!

软件——java进程分析工具

https://arthas.aliyun.com/doc/commands.html#monitor-watch-trace-%E7%9B%B8%E5%85%B3

1.下载
bash
wget https://arthas.aliyun.com/arthas-boot.jar
2. 运行
需要在运行了java程序的环境运行
bash
java -jar arthas-boot.jar

程序会显示出系统中所有正在运行的 Java 进程,Arthas 为每个进程分配了一个序号

从这个列表中找到出问题的那个 Java 进程,并输入相应的序号,比如这里我输入1,然后按下回车,Arhas 就会自动下载完整的包,并 Attach 到目标进程,输出如下:

与 JVM 相关的命令
与类加载、类、方法相关的命令
。统计和观测命令
类 Linux 命令
。其他命令
这是主要的几类命令

与 JVM 相关的命令
这些命令主要与 JVM 相关,用于査看或修改 JVM 的相关性,査看 JM 线程、内存、CPU、GC 等信息:
。jvm -查看当前 JVM 的信息;
·sysenv-查看 JVM 的环境变量:
sysprop-查看 JVM 的系统属性:
·vmoption-查看或修改 JVM 诊断相关的参数:
memory -查看 JVM 的内存信息:
·heapdump-将 Java 进程的堆快照导出到某个文件中,方便我们对堆内存进行分析;
。thread-查看所有线程的信息,包括线程名称、线程组、优先级、线程状态、CPU 使用率、堆栈信息等:dashboard-查看当前系统的实时数据面板,包括了线程、内存、GC 和 Runtime 等信息:可以把它看成是 thread、memory.
jvm、sysenv、sysprop 几个命令的综合体:
。perfcounter-查看当前 JVM 的 Perf Counter 信息:
·logger-查看应用日志信息,支持动态更新日志级别:
。mbean-查看或实时监控 Mbean 的信息:
。vmtool-利用 JVMTI 接口,实现查询内存对象,强制 GC 等功能;

与类加载、类、方法相关的命令
这些命令主要与类加载、类或方法相关,比如在 V 中搜索类或类的方法,查看类的静态属性,编译或反编译,对类进行热更新等:
classloader-查看 JVM 中所有的 Classloader 信息;
。dump-将指定类导出成,class字节码文件:
·jad-将指定类反编译成 Java 源码:
。mc-内存编译器,将 Java 源码编译成.class 字节码文件;
redefine/retransform-这两个命令都可以对已加载的类进行热更新,但是redefine和jad/watch/trace/monitor/tt 等命令会冲突,而且 redefine 后的原来的类不能恢复,所以推荐使用retransform 命令,关于 JDK中 Redefine 和Retransform 机制的区别可以参考 这里:
sc-Search Class,搜索 JVM 中的类:
sm-Search Method,搜索 JV 中的类的方法:
。getstatic-查看类的静态属性:
ogn-执行 ogn表达式;ognl 非常灵活,可以实现很多功能,比如上面的査看或修改系统屋性,查看类的静态属性都可以通过ognl 实现:

统计和观测
这些命令可以对类方法的执行情况进行统计和监控,是排查线上问题的利器:
monitor-对给定的类方法进行监控,统计其调用次数,调用耗时以及成功率等:
。stack-查看一个方法的执行调用堆栈:
。trace-对给定的类方法进行监控,输出该方法的调用耗时,和 monitor 的区别在于,它还能跟踪一级方法的调用链路和耗时
帮助快速定位性能问题:
。watch-观测指定方法的执行数据,包括方法的入参、返回值、抛出的异常等;
。tt-和 watch 命令一样,tt 也可以观测指定方法的执行数据,但 tt 是将每次的执行情况都记录下来,然后再针对每次调用进行排查和分析,所以叫做 Time Tunnel;
reset-上面这些与统计观测相关的命令都是通过 字节码增强技术 来实现的,会在指定类的方法中插入一些切面代码,因此在生产环境诊断结束后,记得执行 reset 命令重置增强过的类(或执行 stop 命令);·profiler-使用 async-profler 对应用采样,并将采样结果生成火焰图:。ifr-动态开启关闭 JFR 记录,生成的 j 文件可以通过 JDK Mission Control 进行分析;

image.png

类 Linux四 命令
除了上面那些用于问题诊断的命令,Arhas 还提供了一些类 Linux 命令,方便我们在 Arthas 终端中使用,比如:。base64-执行 base64 编码和解码:
。cat-打印文件内容:
·cls-清空当前屏幕区域;
echo-打印参数:
。grep-使用字符串或正则表达式搜索文本,并输出匹配的行;
history-输出历史命令:
·pwd-输出当前的工作目录;
tee-从 stdin 读取数据,并同时输出到 stdout 和文件:
。wc-暂时只支持 wc -1,统计输出的行数;
此外,Arthas 还支持在后台运行任务,仿照 Linux 中的相关命令,我们可以使用&在后台运行任务,使用 iobs 列出所有后台任务,使用 Ctr1+z暂停任务,使用bg和 fg,将暂停的任务转到后台或前台继续运行,使用 ki11 终止任务。具体内容可以参考Arthas 后台异步任务。

其他命令
还有一些与 Arthas 本身相关的命令,比如査看 Arthas 的版本号、配置、会话等信息:
·version -查看 Arthas 版本号:
·options-查看或修改 Arthas 全局配置:
keymap-查看当前所有绑定的快捷键,可以通过~/.arthas/conf/inputrc 文件自定义快捷键;
。session-查看当前会话信息:
。auth-验证当前会话;
。quit -退出当前 Arthas 客户端,其他 Arthas 客户端不受影响;
。stop-关闭 Arhas 服务端,所有 Arhas 客户端全部退出;这个命令会重置掉所有的增强类(除了redefine 的类);

问题排查思路
使用 watch 监听方法出入参和异常
使用 logger 动态更新日志级别
使用 ogn1 查看系统属性和应用配置
使用 jad/sc/retransform 热更新代码
其他使用场景
Arthas 的使用非常灵活,有时候甚至还会有一些意想不到的功能,除了上面这些使用场景,Arthas 的 lssues 中还收集了一些 用户案例,其中有几个案例对我印象很深,非常有启发性,可供参考,
使用 stack 命令定位System.exit/System.gc的调用来源:https://github.com/alibaba/arthas/issues/20使用 sc 和 jad 排查 NoSuchilethodError 问题:https://github. com/alibaba/arthas/issues/160
使用 redefine 修改 StringBuilder.toString() 定位未知的日志来源:https://github.com/alibaba/arthas/issues/263使用 trace javax.serylet.Serylet/Filter 排査 Spring Boot 应用 404/401 问题:https://github.com/alibaba/arthas/issues/429
使用 tt 定位 Java 应用 CPU 负载过高问题:https://github.com/alibaba/arthas/issues/1202使用 profiler 做复杂链路分析,排査性能问题:https://github.com/alibaba/arthas/issues/1416使用 trace 命令将接囗性能优化十倍:https://github.com/alibaba/arthas/issues/1892

来源于:https://blog.csdn.net/qq_34777982/article/details/135020967

********************************************************************************************************
                               安得广厦千万间,大庇天下寒士俱欢颜!
********************************************************************************************************