JVM性能优化常用工具(JDK1.8)
标准参数(各个JVM版本基本稳定不变的)
-help
-server
-client
-version
-showversion
-cp
-classpath
-X参数(非标准参数,会变,但是变化小)
-Xint 解释执行
-Xcomp 第一次使用就编译成本地代码
-Xmixed 混合模式,JVM自己去决定是否编译成本地代码(默认)
-XX参数(非标准,变化很大,或者实验性的)
布尔类型参数
格式:
-XX:[+-]<name> 表示启用或者禁用name的属性 +号表示启动,-号表示禁用
比如:
-XX:+UseConcMarkSweepGC 启用CMS
-XX:+UseG1GC 启用G1
KV类型
格式:
-XX:<name>=<value> 表示name的值是value
比如:
-XX:MaxGCPauseMillis = 500 gc的最大停顿时间是500毫秒
XX:GCTimeRatio = 19
-XMs等价于 -XX:InitialHeapSize 初始化堆大小
-XMx等价于 -XX:MaxHeapSize 最大堆大小
Jps 进程查询
用来查看java进程的工具
常用命令格式
jps -参数
常用参数
-
-q
禁止显示类名称,也就是只显示进程ID -
-m
显示进程ID,启动的jar,和传递给Jar的参数,比如springboot启动的时候传的配置文件 -
-l
显示应用程序main类的完整程序包名称或应用程序JAR文件的完整路径名。 -
-v
显示进程ID,启动的jar,和传递给JVM的参数 -
-V
禁止类名称,JAR文件名和传递给main方法的参数的输出,仅生成本地JVM标识符的列表。
jinfo 配置信息
查看启动中的JVM的配置信息
常用命令格式
jinfo 参数 进程ID
常用参数
-
-flag 配置项 进程ID
查看当前进程中JVM的某个配置项配置的什么内容 -
-flags 进程ID
查看当前进程的JVM修改了那些默认值,也就是修改过的配置项都会显示出来 -
-flag +/-配置项 进程ID
启用(+)或禁用(-)当前进程JVM的某个配置项 -
-flag 配置项=配置内容 进程ID
修改当前进程JVM的某个配置项为指定的内容
jstat 内存统计
查看JVM的统计信息,比如类加载信息,垃圾收集信息和JIT编译等信息
常用命令格式
jstat 参数 进程ID
常用参数
-
-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:总垃圾收集时间。 -
-gccapacity
内存池的生成和空间容量。NGCMN:最小新一代容量(kB)。
NGCMX:最大新一代容量(kB)。
NGC:当前的新一代容量(kB)。
S0C:当前幸存者空间0容量(kB)。
S1C:当前生存空间1的容量(kB)。
EC:当前伊甸园空间容量(kB)。
OGCMN:最小旧发电容量(kB)。
OGCMX:最大旧发电容量(kB)。
OGC:当前的旧发电量(kB)。
OC:当前的旧空间容量(kB)。
MCMN:最小元空间容量(kB)。
MCMX:最大元空间容量(kB)。
MC:元空间容量(kB)。
CCSMN:压缩的类空间最小容量(kB)。
CCSMX:压缩的类空间最大容量(kB)。
CCSC:压缩的类空间容量(kB)。
YGC:年轻一代GC事件的数量。
FGC:完整GC事件的数量。 -
-gccause
该选项显示的垃圾收集统计信息摘要与该选项相同-gcutil,但包括上一个垃圾收集事件和(如果适用)当前垃圾收集事件的原因。除了为列出的列之外-gcutil,此选项还添加了以下列。LGCC:上次垃圾回收的原因
GCC:当前垃圾收集的原因 -
-gcnew
新生代统计数据。S0C:当前幸存者空间0容量(kB)。
S1C:当前生存空间1的容量(kB)。
S0U:幸存者空间0利用率(kB)。
S1U:幸存者空间1利用率(kB)。
TT:任职期限。
MTT:最大使用期限阈值。
DSS:所需的幸存者大小(kB)。
EC:当前伊甸园空间容量(kB)。
EU:伊甸园空间利用率(kB)。
YGC:年轻一代GC事件的数量。
YGCT:年轻一代垃圾回收时间。 -
-gcnewcapacity
新生代空间大小统计信息。NGCMN:最小新一代容量(kB)。
NGCMX:最大新一代容量(kB)。
NGC:当前的新一代容量(kB)。
S0CMX:最大幸存者空间0容量(kB)。
S0C:当前幸存者空间0容量(kB)。
S1CMX:最大幸存者空间1容量(kB)。
S1C:当前生存空间1的容量(kB)。
ECMX:最大伊甸园空间容量(kB)。
EC:当前伊甸园空间容量(kB)。
YGC:年轻一代GC事件的数量。
FGC:完整GC事件的数量。 -
-gcold
老年代和元空间行为统计。MC:元空间容量(kB)。
MU:元空间利用率(kB)。
CCSC:压缩的类空间容量(kB)。
CCSU:使用的压缩类空间(kB)。
OC:当前的旧空间容量(kB)。
OU:旧空间利用率(kB)。
YGC:年轻一代GC事件的数量。
FGC:完整GC事件的数量。
FGCT:完整的垃圾收集时间。
GCT:总垃圾收集时间。 -
-gcoldcapacity
老年代大小统计信息。OGCMN:最小旧发电容量(kB)。
OGCMX:最大旧发电容量(kB)。
OGC:当前的旧发电量(kB)。
OC:当前的旧空间容量(kB)。
YGC:年轻一代GC事件的数量。
FGC:完整GC事件的数量。
FGCT:完整的垃圾收集时间。
GCT:总垃圾收集时间。 -
-gcmetacapacity
元空间大小统计信息。MCMN:最小元空间容量(kB)。
MCMX:最大元空间容量(kB)。
MC:元空间容量(kB)。
CCSMN:压缩的类空间最小容量(kB)。
CCSMX:压缩的类空间最大容量(kB)。
YGC:年轻一代GC事件的数量。
FGC:完整GC事件的数量。
FGCT:完整的垃圾收集时间。
GCT:总垃圾收集时间。 -
-gcutil
垃圾收集统计信息摘要。S0:幸存者空间0利用率占该空间当前容量的百分比。
S1:生存空间1利用率占空间当前容量的百分比。
E:Eden空间利用率占空间当前容量的百分比。
O:旧空间利用率占空间当前容量的百分比。
M:元空间利用率占空间当前容量的百分比。
CCS:压缩的类空间利用率(以百分比表示)。
YGC:年轻一代GC事件的数量。
YGCT:年轻一代垃圾回收时间。
FGC:完整GC事件的数量。
FGCT:完整的垃圾收集时间。
GCT:总垃圾收集时间。 -
-printcompilation
Java HotSpot VM编译器方法统计信息。Compiled:由最近编译的方法执行的编译任务数。
Size:最近编译的方法的字节码的字节数。
Type:最近编译的方法的编译类型。
Method:标识最近编译的方法的类名和方法名。类名使用斜杠(/)代替点(.)作为名称空间分隔符。方法名称是指定类中的方法。这两个字段的格式与HotSpot-XX:+PrintCompilation选项一致。
jstack 线程堆栈跟踪
查看JVM的线程堆栈信息,比如死锁
导出的堆栈信息一般会结合如下命令去分析
top -d 进程id -H 这个是查看当前进程中的线程信息
printf "%x" 线程id 这个是将10进制的线程id转化为十六进制的,然后从jstack转出的文件中找对应的线程信息,对应文件中的nid=十六进制的线程id
常用命令格式
jstack 参数 进程ID
常配套转储操作 比如 jstack 进程id > xxx.log
常用参数
-
无参
用的比较多 -
-F
当Jstack -l pid没有响应时,强制堆栈转储。 -
-l
打印有关锁的其他信息,例如拥有的java.util.concurrent有权同步器的列表 -
-m
打印具有Java和本机C/C++帧的混合模式堆栈跟踪。
jmap dump内存信息
Java的内存信息-打印指定进程的共享对象存储映射或堆内存详细信息。
常用命令格式
jmap 参数 进程ID
常用参数
-
无参
没有参数时,JMAP命令打印共享对象映射。对于加载于目标JVM中的每个共享对象,打印起始地址,映射大小和共享对象文件的完整路径。 -
-dump:format=b, file=filename 或者-dump:live,format=b, file=filename
将hprof二进制格式的Java堆信息转储到file指定的文件中。live子选项是可选的,但是当指定时,只转储堆中的活动对象。要想读取文件可以用jhat工具,或者导入到分析工具里边看,比如mat和jvisualvm等等 -
-finalizerinfo
打印等待回收的对象信息 -
-heap
打印所使用的垃圾收集的堆摘要、配置、GC算法和堆使用情况。此外,还打印了插入字符串的数量和大小。 -
-histo或histo:live
打印堆的直方图。对于每个Java类,都会打印对象数、内存大小(以字节为单位)和完全限定的类名。JVM内部类名以星号(*)前缀打印。如果指定了live,则只计算活动对象。 -
-clstats
打印Java堆的类装入器统计信息。对于每个类加载器,其名称、活动程度、地址、父类装入器以及加载的类的数量和大小都将打印出来。 -
-F
当pid没有响应时,将此参数与jmap -dump或jmap -histo选项一起使用。它不支持live。
jhat 查看dump出的信息(很少用)
主要是通过web服务查看jmap导出来的堆信息,默认端口是7000,一般都用工具代替了,比如MAT,我用的比较少。
常用命令格式
jhat 参数 jmap导出的文件
常用参数
-
-stack false或true
关闭跟踪对象分配调用堆栈。如果堆转储中没有分配站点信息,则必须将此标志设置为false。默认值为true。 -
-refs false或true
关闭对对象引用的跟踪。默认值为true。默认情况下,将为堆中的所有对象计算反向指针,反向指针是指向指定对象(如引用或传入引用)的对象。 -
-port 端口号
设置jhat HTTP服务器的端口。默认值为7000。
结合使用的linux常用命令
-
vmstat 秒数 次数
vm的信息, 参数1是多少秒 参数2是输出次数 意思就是每隔几秒输出一次,一共输出几次后停止 -
free -g或-m
以哪个单位查看当前内存信息 -
iostat -dx 1等
查看IO读写信息 -
netstat -nlp等
查看网络,端口等信息