线上诊断及调优工具
arthas使用
下载:https://github.com/alibaba/arthas/releases
文档:https://arthas.aliyun.com/
使用 cls 命令可以清空命令行
一、启动
选择对应进程
java -jar arthas-boot.jar
二、常用命令使用
1、将命令的结果完整保存在日志文件中,便于后续进行分析
options save-result true
结果会异步保存在:{user.home}/logs/arthas-cache/result.log
2、一个全局视角来查看系统的运行状况
dashboard命令
3、监控JVM的实时运行状态
jvm命令
4、类从哪个 jar 包加载,为什么会报异常
sc -d *FunctionController*
classloader -c 18b4aac2 -r
com/gwssi/common/tax/controller/FunctionController.class
5、编译源码及代码方法结束后入参和返回值
watch com.gwssi.common.tax.controller.FunctionController convert "{params,returnObj}" -f -x 4
或者
tt -t com.gwssi.common.tax.controller.FunctionController convert
查看结果
tt -i 1000
tt可以保留多条记录,方便重现问题及入参重复使用
编译源码:
jad --source-only 路径
6、热更新class文件,不停止服务
mc 路径 将java文件编译为class,mc命令不可用时,可在本地编译然后线上替换
使用redefine热更新
redefine /tmp/com/ruoyi/web/TestServlet.class
7、强制fullgc
vmtool --action forceGc
调优
一、常用jdk工具
jps(JVM Process Status Tool):显示指定系统内所有的虚拟机进程
jstat(JVM Statistics Monitoring Tool):用于收集虚拟机各方面的运行数据
jinfo(Configuration Info forJava):显示虚拟机配置信息
jmap(Memory Map for Java):生成虚拟机的内存转储快照(heapdump文件)
jhat(JVM Heap Dump Browser):用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果
jstack(Stack Trace forJava):显示虚拟机的线程快照
1.1 jps(JVM Process Status Tool)
作用:列出正在运行的虚拟机进程。并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)
命令格式:
jps[options][hostid]
参数解释:
第一个参数:options
-q:显示进程ID
-m:显示进程ID,主类名称,以及传入main方法的参数
-l:显示进程ID,主类全名
-v:显示进程ID,主类名称,以及传入JVM的参数
-V:显示进程ID,主类名称
[-mlvV]可以任意组合使用
第二个参数:hostid
主机或者是服务器的ip,如果不指定,就默认为当前的主机或者是服务器。
注意:如果需要查看其他机器上的jvm进程,需要在待查看机器上启动jstatd。
1.2 jstat(JVM Statistics Monitoring Tool)
作用:监视虚拟机各种运行状态信息,可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
命令格式:
jstat [ options vmid [ interval [count] ] ]
参数解释:
第一个参数:options
代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:
-class:显示有关类加载器行为的统计信息
-compiler:显示有关Java HotSpot VM即时编译器行为的统计信息
-gc:显示有关垃圾收集堆行为的统计信息
-gccapacity:显示有关各个垃圾回收代容量及其相应空间的统计信息
-gccause:显示有关垃圾收集统计信息(同-gcutil),以及上一次和当前(如果适用)垃圾收集事件的原因
-gcnew:显示新生代行为的统计信息
-gcnewcapacity:显示有关新生代大小及其相应空间的统计信息
-gcold:显示有关老年代行为的统计信息和元空间统计信息
-gcoldcapacity:显示有关老年代大小的统计信息
-gcmetacapacity:显示有关元空间大小的统计信息
-gcutil:显示有关垃圾收集统计信息
-printcompilation:显示Java HotSpot VM编译方法统计信息
第二个参数:vmid
如果是本地虚拟机进程,vmid和本地虚拟机唯一ID是一致的
如果是远程虚拟机进程,那vmid的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
第三个参数:interval
采样间隔,单位为秒(s)或毫秒(ms)
默认单位是毫秒。必须为正整数。
指定后,该jstat命令将在每个间隔产生其输出
第四个参数:count
要显示的样本数
注意点:
参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次:
查询一次进程8888垃圾收集情况:
jstat –gc 8888
假设需要每250毫秒查询一次进程8888垃圾收集情况,一共查询10次,那命令应当是:
jstat –gc 8888 250 10
常见统计选项演示:
-class选项:
类加载器统计信息:
Loaded:已加载的类数
Bytes:加载的kB数
Unloaded:卸载的类数
Bytes:卸载的KB数
Time:执行类加载和卸载操作所花费的时间
-compiler选项:
Java HotSpot VM即时编译器统计信息:
Compiled:执行的编译任务数
Failed:编译任务数失败
Invalid:无效的编译任务数
Time:执行编译任务所花费的时间
FailedType:上次失败的编译的编译类型
FailedMethod:上次失败的编译的类名和方法
-gc 选项:
垃圾收集的堆统计信息
S0C:当前幸存者空间0容量(kB)
S1C:当前生存空间1的容量(kB)
S0U:幸存者空间0使用大小(kB)
S1U:幸存者空间1使用大小(kB)
EC:当前伊甸园空间容量(kB)
EU:伊甸园空间使用大小(kB)
OC:当前的老年代容量(kB)
OU:老年代使用大小(kB)
MC:元空间容量(kB)
MU:元空间使用大小(kB)
CCSC:压缩的类空间容量(kB)
CCSU:使用的压缩类空间(kB)
YGC:新生代垃圾收集事件的数量
YGCT:新生代垃圾回收时间
FGC:完整GC事件的数量
FGCT:完整的垃圾收集时间
GCT:总垃圾收集时间
-gcutil 选项:
垃圾收集统计信息
S0:幸存者空间0利用率占该空间当前容量的百分比
S1:幸存者空间1利用率占空间当前容量的百分比
E:Eden空间利用率占空间当前容量的百分比
O:老年代利用率占空间当前容量的百分比
M:元空间利用率占空间当前容量的百分比
CCS:压缩的类空间利用率,以百分比表示
YGC:新生代GC事件的数量
YGCT:新生代垃圾回收时间
FGC:完整GC事件的数量
FGCT:完整的垃圾收集时间
GCT:总垃圾收集时间
1.3 jinfo(Configuration Info forJava)
作用:实时地查看和调整虚拟机各项参数
命令格式:
jinfo [options]
参数解释:
第一个参数:options
no option:输出全部的参数和系统属性
-flag name:输出对应名称的参数
-flag [+|-]name:开启或者关闭对应名称的参数
-flag name=value:设定对应名称的参数
-flags:输出全部的参数
-sysprops:输出系统属性
命令演示:
命令:jinfo pid
描述:输出当前 jvm 进程的全部参数和系统属性
命令:jinfo -flag name pid
描述:使用该命令,可以查看指定的 jvm 参数的值
如:查看当前 jvm 进程是否开启打印 GC 日志
jinfo -flag PrintGC pid
命令:jinfo -flag [+|-]name pid
描述:开启或者关闭对应名称的参数
使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。尤其在线上的环境特别有用。
jinfo -flag +PrintGC pid
jinfo -flag PrintGC pid
jinfo -flag +PrintGC pid
jinfo -flag PrintGC pid
命令:jinfo -flag name=value pid
描述:修改指定参数的值。
和上面的例子相似,但是上面的主要是针对 boolean 值的参数设置的。
如果是设置 value值,则需要使用 name=value 的形式
jinfo -flag HeapDumpPath pid
jinfo -flag HeapDumpPath=d:\dump pid
jinfo -flag HeapDumpPath pid
jinfo -flag HeapDumpPath= pid
jinfo -flag HeapDumpPath pid
**注意:**jinfo虽然可以在java程序运行时动态地修改虚拟机参数,但并不是所有的参数都支持动态修改
命令:jinfo -flags pid
描述:输出全部的虚拟机参数
命令:jinfo -sysprops pid
描述:输出当前虚拟机进程的全部的系统属性
1.4 jmap(Memory Map for Java)
作用:是一个多功能的命令,它可以生成 java 程序的 dump 文件, 也可以查看堆内对象信息、查看 ClassLoader 的信息以及 finalizer 队列
命令格式:
jmap [options]
参数解释:
第一个参数:options
no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
heap: 显示Java堆详细信息
histo[:live]: 显示堆中对象的统计信息
clstats:打印类加载器信息
finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump::生成堆转储快照
命令演示:
命令:jmap pid
描述:查看进程的内存映像信息
使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称
命令:jmap -heap pid
描述:显示Java堆详细信息
打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息
命令:jmap -histo:live pid
命令:jmap -histo pid
描述:显示堆中对象的统计信息
其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象
命令:jmap -clstats pid
描述:打印类加载器信息
-clstats是-permstat的替代方案,在JDK8之前,-permstat用来打印类加载器的数据
打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
命令:jmap -finalizerinfo pid
描述:打印等待终结的对象信息
Number of objects pending for finalization:0 说明当前F-Queue队列中并没有等待Finalizer线程执行finalizer方法的对象。
命令:jmap -dump:live,format=b,file=d:\jmap.bin pid
描述:生成堆转储快照dump文件
以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用
1.5 jhat(JVM Heap Dump Browser)
作用:与jmap搭配使用来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。
命令格式:
jhat [options] 堆转储文件
参数解释:
第一个参数:options
[-stack ]:开关对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用,则必须将此标志设置为 false,默认值为 true。
[-refs ]:开关对象引用跟踪(tracking of references to objects)。 默认值为 true。默认情况下,返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references),会统计/计算堆中的所有对象。
[-port ]:设置 jhat HTTP server 的端口号。默认值 7000。
[-exclude ]:指定对象查询时需要排除的数据成员列表文件(列出应从可访问对象查询中排除的数据成员的文件)。例如,如果文件列列出了 java.lang.String.value,那么当从某个特定对象 Object o 计算可达的对象列表时,引用路径涉及 java.lang.String.value 的都会被排除
[-baseline ]:指定一个基准堆转储(baseline heap dump)。在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new)。其他对象被标记为新的(new)。在比较两个不同的堆转储时很有用。
[-debug ]:设置 debug 级别。0 表示不输出调试信息。值越大则表示输出更详细的 debug 信息。
[-version]:启动后只显示版本信息就退出
第二个参数:堆转储文件
要浏览的Java二进制堆转储文件
命令演示:
命令:jhat D:\jmap.bin
执行命令后,我们看到系统开始读取这段dump信息,当系统提示Server is ready的时候,用户可以通过在浏览器键入http://ip:7000进行查询。有时 dump 文件很大,在启动时会报堆空间不足的错误,可加参数 jhat -J-Xmx512m ,这个内存大小可自行设置。
看文件中的内容,重点看下面的七个:
jhat 启动后显示的 html 页面中包含有:
A:显示出堆中所包含的所有的类(All Classes(including platform))。
B:从根集能引用到的对象(All Members of the Rootset)。
C:显示平台包括的所有类的实例数量(Instance Counts for All Classes(including platform/excluding platform))。
D:一般查看堆异常情况主要看 Instance Counts for All Classes(excluding platform)平台外的所有对象信息和 Heap Histogram 以树状图形式展示堆情况。
E:堆实例的分布表(Heap Histogram)。
F:Finalizer 摘要(Finalizer Summary)。
G:执行对象查询语句(OQL)。
#查询字符串
select s from java.lang.String s
1.6 jstack(Stack Trace forJava)
作用:查看或导出 Java 应用程序中线程堆栈信息 .
线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、长时间等待外部资源等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息.
命令格式:
jstack [ options ]
参数解释:
第一个参数:options
-F : 当线程挂起时,使用jstack -l pid 请求不被响应时,强制输出线程堆栈
-l : 除堆栈外,显示关于锁的附加信息,例如 ownable synchronizers
-m : 可以同时输出java以及C/C++的堆栈信息
二、常用jdk工具(可视化)
2.1 jdk的bin目录内JConsole.exe,jvisualvm.exe,jmc.exe等