JVM调优命令及工具
写在前面的话:
本文介绍的调优命令及结果都是针对的: jdk8版本
为了方便示例,本文中 2272 指的是我java项目的进程id,也就是pid
一、调优时基础命令
这里要讲的是 java自带一些查看jvm运行状况的命令。 市面上的调优工具,底层都是用的这些命令,把这些命令输出的信息变成可视化效果更好的UI界面。
比如:我这里有个运行的java项目,通过jps命令查看到它的进程Id为2272, 以下我就用pid为2272来举例了。
1.1 Jmap (java内存信息、实例个数以及占用内存大小)
(1)命令: jmap -histo 2272 > ./log.txt
解释:查看项目的内存、实例数量信息 ,写入到这个 log.txt文件。
我们打开log.txt文件查看内容如下:
当项目运行内存异常的时候, 我们可以通过此命令,查看代码中是哪个类它占用空间异常,从而定位修改。
(2)命令: jmap -heap 2272
解释:查看jvm的堆信息 (图中,我在每个结果后 都标记上了中文解释)。
使用该命令,可以知道堆空间的分配、使用情况。 当我们要减少gc优化的时候,查看这些信息是非常关键且必要的。
(3)命令: jmap ‐dump:format=b,file=xxxx.hprof 2272
解释:可以把内存信息 保存成文件xxxx.hprof 。 然后用jvisualvm工具打开.hprof文件,离线查看内存情况了。 就相当于是某一刻的 内存信息的快照一样。
用jvisualvm命令工具 (jvisualvm工具的使用,下面会讲到) 导入.hprof文件后,可以查看实例数、类名、和大小,效果就相当于上面讲到的命令 jmap -histo pid 。
在工作中,如果程序发生OOM,我们希望看到它OOM前的内存信息,就可以分析是什么原因造成的OOM异常。
于是这就用到了内存信息快照的方式,在程序OOM前保存它的快照文件,然后等我们后续再打开文件分析。
我们需要添加两个配置信息,就可以 设置内存溢出自动导出dump文件:
‐XX:+HeapDumpOnOutOfMemoryError ‐XX:HeapDumpPath=D:\jvm.dump
(注意 D:\jvm.dump 是我设置的文件路径。)
1.2 jatack (查线程信息)
(1) 命令:jstack 2272
解释:查看项目的线程情况 (可以通过该命令查找项目中线程死锁的情况)
(2)通过jstack命令 找出占用cpu最高的线程堆栈信息
- 使用命令top -p pid ,显示你的java进程的内存情况,pid是你的java进程号,比如19663
2,按H,获取每个线程的内存情况
3.找到内存和cpu占用最高的线程tid,比如19664
4,转为十六进制得到 0x4cd0,此为线程id的十六进制表示
5,执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法
6,查看对应的堆栈信息找出可能存在问题的代码
1.3 Jinfo (查jvm参数信息)
(1) 命令:jinfo -flags 2272
解释:查看正在运行的Java应用程序jvm的参数。(我们在调优的时候,查看设置的jvm参数有没有生效,就可以用这个命令)
(2) 命令:jinfo -sysprops 2272
解释:查看java系统参数
1.4 Jstat (查gc情况)
(1) 命令:jstat -gc 2272
这个命令最常用,我们可以通过它看gc的执行次数、内存使用,等整体情况。
参数对应的解释:
S0C:第一个幸存区的大小,单位KB
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小(元空间)
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间,单位s
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间,单位s
GCT:垃圾回收消耗总时间,单位s
(2) 命令:jstat -gccapacity 2272
堆内存统计
参数对应的解释:
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数
(3) 命令: jstat -gcnew 2272
新生代垃圾回收统计
参数对应的解释:
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
(4) 命令:jstat -gcnewcapacity 2272
新生代内存统计
参数对应的解释:
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
(5) 命令:jstat -gcold 2272
老年代垃圾回收统计
参数对应的解释:
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
(6) 命令:jstat -gcoldcapacity 2272
老年代内存统计
参数对应的解释:
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
(7) 命令:jstat -gcmetacapacity 2272
元数据空间统计
参数对应的解释:
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
(8) 命令:jstat -gcutil 2272
参数对应的解释:
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
二、jvisualvm工具
这是java自带的调优工具
打开cmd => 输入 jvisualvm 命令 就可以打开工具。
在左边栏中 选择自己的java项目,查看内存信息、线程信息、gc信息
visual GC这一栏默认是没有的,需要安装插件。 安装参考:https://blog.youkuaiyun.com/shuai825644975/article/details/78970371
三、Arthas
Arthas 是Alibaba开源的Java诊断工具,官网地址:https://arthas.aliyun.com/doc/
3.1 下载安装
输入命令下载 arthas-boot.jar
curl -O https://arthas.aliyun.com/arthas-boot.jar
启动程序命令:
Java -jar arthas-boot.jar
按数字来选择要进入哪个项目,然后按 回车。就进入程序了。
3.2 命令使用
输入dashboard可以查看整个进程的运行情况,线程、内存、GC、运行环境信息
还有很多命令,这里就不再列举,可以查看官方API有详细介绍。https://arthas.aliyun.com/doc/commands.html