Solo  当前访客:0 开始使用

线上诊断及调优工具


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等

0 0