目录
1.1.2 jps -l :用于输出主类的全名,如果进程执行的是jar包,输出jar包的全名称
1.1.3 jps -v :用于输出虚拟机进程启动时JVM的参数
1.2.1 jstat -class [进程号] :类加载统计
1.2.3 jstat -gccapacity [进程号] :堆内存统计
1.2.4 jstat -gcmetacapacity [进程号] :元空间统计
1.2.5 jstat -gcnew [进程号] :新生代统计
1.2.6 jstat -gcold [进程号] :老年代统计
1.2.7 jstat -gcutil [进程号] :垃圾回收统计和内存使用统计
1.3.1 jinfo [进程号] :输出当前 JVM 进程的全部参数和系统属性
1.3.2 jinfo -flags [进程号] :输出全部JVM参数
1.3.3 jinfo -flag InitialHeapSize [进程号] :查看堆的初始容量
1.3.4 jinfo -flag PrintGC [进程号] :查看是否开启GC日志
1.4.1 jstack [进程号] :查看当前进程的线程快照,是否存在线程死锁问题
前言
1W:什么是JVM?
- JVM:全称“Java Virtual Machine”,即Java虚拟机,用于运行Java应用程序;
2W:为什么要JVM调优?
- JVM调优是对Java程序性能的一种优化方式,通过对JVM运行参数和内存的调整,以达到JVM的最佳性能和资源使用率;
3W:JVM如何调优?
- 通过使用工具对Java程序进行监控、定位以达到调优的效果;
JVM常用命令行工具
- jps:用于查看所有Java进程
- jstat:用于收集HotSpot虚拟机各方面的运行数据
- jinfo:显示JVM虚拟机各项信息
- jstack:用于生成虚拟机当前时刻的线程快照,线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合
1.1 jps命令
“JVM Process Status”,用于查看所有Java的进程;
1.1.1 jps :显示虚拟机执行主类名称和进行号
1.1.2 jps -l :用于输出主类的全名,如果进程执行的是jar包,输出jar包的全名称
1.1.3 jps -v :用于输出虚拟机进程启动时JVM的参数
1.1.4 jps命令总结
命令 | 描述 |
---|---|
jps命令用于查看所有Java进程 | |
jps | 显示虚拟机执行主类名称以及进程的本地虚拟机唯一ID |
jps -l | 相比于1中,显示的信息更全面,如果进程执行的是jar包,会显示jar包的名称 |
jps -v | 显示JVM虚拟机进程启动时所有的参数 |
1.2 jstat命令
“JVM Statistics Monitoring Tool”, 用于监视虚拟机各种运行状态信息;
1.2.1 jstat -class [进程号] :类加载统计
字段 | 含义 |
---|---|
Loaded | 已加载类的数量 |
Bytes | 加载类占用的内存大小,单位为字节(B) |
Unloaded | 卸载类的数量 |
Bytes | 卸载类释放的内存大小,单位为字节(B) |
Time | 类加载和卸载所花费的时间,单位为毫秒(ms) |
1.2.2 jstat -gc [进程号] :垃圾回收统计
字段 | 含义 |
---|---|
S0C | 新生代中第一个幸存区(Survivor 0)的容量(KB) |
S1C | 新生代中第二个幸存区(Survivor 1)的容量(KB) |
S0U | 新生代中第一个幸存区(Survivor 0)已使用的容量(KB) |
S1U | 新生代中第二个幸存区(Survivor 1)已使用的容量(KB) |
EC | 新生代中Eden区的容量(KB) |
EU | 新生代中Eden区已使用的容量(KB) |
OC | 老年代(Old Gen)的容量 (KB) |
OU | 老年代已使用空间 (KB) |
MC | 元空间(Metaspace)的容量 (KB) |
MU | 元空间(Metaspace)已使用的容量 |
CCSC | 压缩类空间大小 (KB) |
CCSU | 压缩类空间已使用大小 (KB) |
YGC | 新生代垃圾回收次数 |
YGCT | 新生代垃圾回收总时间 (秒) |
FGC | 老年代(Full GC)垃圾回收次数 |
FGCT | 老年代垃圾回收总时间 (秒) |
GCT | 垃圾回收总时间 (秒) |
1.2.3 jstat -gccapacity [进程号] :堆内存统计
字段 | 含义 |
---|---|
NGCMN | 新生代(young)中初始化(最小)的大小(KB) |
NGCMX | 新生代(young)的最大容量(KB) |
NGC | 新生代(young)的当前容量(KB) |
S0C | 新生代中第一个幸存区(surivivor) 的容量(KB) |
S1C | 新生代中第二个幸存区 (survivor)的容量(KB) |
EC | 新生代中Eden区的容量(KB) |
OGCMN | 老年代中初始化(最小)的大小(KB) |
OGCMX | 老年代的最大容量(KB) |
OGC | 老年代当前新生成的容量(KB) |
OC | 老年代的容量(KB) |
MCMN | 元空间(metaspace)中初始化(最小)的大小(KB) |
MCMX | 元空间(metaspace)的最大容量(KB) |
MC | 元空间(metaspace)当前新生成的容量(KB) |
CCSMN | 最小压缩类空间大小(KB) |
CCSMX | 最大压缩类空间大小(KB) |
CCSC | 当前压缩类空间大小(KB) |
YGC | 从应用程序启动到采样时新生代垃圾回收次数 |
FGC | 从应用程序启动到采样时老年代垃圾回收次数 |
1.2.4 jstat -gcmetacapacity [进程号] :元空间统计
字段 | 含义 |
---|---|
MCMN | 最小元数据容量(KB) |
MCMX | 最大元数据容量(KB) |
MC | 当前元空间大小(KB) |
CCSMN | 最小压缩类空间大小(KB) |
CCSMX | 最大压缩类空间大小(KB) |
CCSC | 当前压缩类空间大小(KB) |
YGC | 从应用程序启动到采样时新生代垃圾回收次数 |
FGC | 从应用程序启动到采样时老年代垃圾回收次数 |
FGCT | 从应用程序启动到采样时老年代垃圾回收所用时间(秒) |
GCT | 垃圾回收总时间 (秒) |
1.2.5 jstat -gcnew [进程号] :新生代统计
字段 | 含义 |
---|---|
S0C | 新生代中第一个幸存区(surivivor) 的容量(KB) |
S1C | 新生代中第二个幸存区 (survivor)的容量(KB) |
S0U | 新生代中第一个幸存区(Survivor 0)已使用的容量(KB) |
S1U | 新生代中第二个幸存区(Survivor 1)已使用的容量(KB) |
TT | 持有次数限制 |
MTT | 最大持有次数限制 |
DSS | 期望的幸存区大小 |
EC | 新生代中Eden区的容量(KB) |
EU | 新生代中Eden区目前已使用的容量(KB) |
YGC | 从应用程序启动到采样时新生代垃圾回收次数 |
YGCT | 新生代垃圾回收总时间 (秒) |
1.2.6 jstat -gcold [进程号] :老年代统计
字段 | 含义 |
---|---|
MC | 当前元数据空间大小(KB) |
MU | 元空间(Metaspace)已使用的容量 |
CCSC | 压缩类空间大小(KB) |
CCSU | 压缩类空间已使用大小 (KB) |
OC | 老年代的容量(KB) |
OU | 老年代已使用空间 (KB) |
YGC | 从应用程序启动到采样时新生代垃圾回收次数 |
FGC | 从应用程序启动到采样时老年代垃圾回收次数 |
FGCT | 从应用程序启动到采样时老年代垃圾回收所用时间(秒) |
GCT | 垃圾回收总时间 (秒) |
1.2.7 jstat -gcutil [进程号] :垃圾回收统计和内存使用统计
字段 | 含义 |
---|---|
S0 | 新生代中第一个幸存区(survivor)已使用的占当前容量百分比 |
S1 | 新生代中第二个幸存区(survivor)已使用的占当前容量百分比 |
E | 新生代中Eden区已使用的占当前容量百分比 |
O | 老年代已使用的占当前容量百分比 |
M | 元空间(metaspace)占当前容量百分比 |
YGC | 从应用程序启动到采样时新生代垃圾回收次数 |
YGCT | 新生代垃圾回收总时间 (秒) |
FGC | 从应用程序启动到采样时老年代垃圾回收次数 |
FGCT | 从应用程序启动到采样时老年代垃圾回收所用时间(秒) |
GCT | 垃圾回收总时间 (秒) |
1.3 jinfo命令
“Configuration lnfo for Java”, 用于显示JVM各项参数;
1.3.1 jinfo [进程号] :输出当前 JVM 进程的全部参数和系统属性
第一部分为系统属性,第二部分为JVM参数
1.3.2 jinfo -flags [进程号] :输出全部JVM参数
1.3.3 jinfo -flag InitialHeapSize [进程号] :查看堆的初始容量
1.3.4 jinfo -flag PrintGC [进程号] :查看是否开启GC日志
如果没有打开,则输出:-xx:-PrintGC.可使用+PrintGC 开启
1.4 jstack命令
“Stack Trace for Java”, 用于生成JVM当前时刻的线程快照;
生成线程快照主要是为了定位线程长时间出现停顿的原因,如线程死锁、死循环、请求外部资源导致的长时间等问题造成的线程长时间停顿;
1.4.1 jstack [进程号] :查看当前进程的线程快照,是否存在线程死锁问题
1.5 jconsole命令打开可视化工具
1.6 jvisualvm命令打开可视化工具
JVM常见运行参数
2.1 标注参数
2.1.1 java -help :显示标注参数指令
2.1.2 java -version :显示产品版本
Java HotSpot 具有两种模式,server模式和client模式
- server :机器配置至少2个以上CPU和2G以上的物理内存,64位操作系统只支持server模式,默认使用并行垃圾收集器
- client :适用于内存较小的桌面应用程序,默认使用Serial串行垃圾收集器
2.2 X参数
2.2.1 java -X :显示X参数指令
参数 | 含义 | 描述 |
---|---|---|
-Xms | 设置初始Java堆大小 | 物理内存的1/64;当空闲堆内存小于40%时,代表堆内存不足,则JVM增大堆内存,直到-Xmx的最大限制 |
-Xmx | 设置最大Java堆大小 | 物理内存的1/4;当空闲堆内存大于70%时,代表堆内存闲置过多,则JVM会减少堆内存,指导-Xms的最小限制 |
-Xmn | 新生代大小 | 新生代内存容量=Eden+survivor *2 |
-Xss | 设置Java线程堆栈大小 | JDK5.0之后每个线程虚拟机栈大小为1MB,以前为256KB |
-XX:NewRatio | 新生代与老年代的比值 | -XX:NewRatio=4 表示新生代与老年代的比值为1:4 新生代占整个堆栈的1/5 |
-XX:SurvivorRatio | Eden区与幸存区(survivor)的比值 | 默认值为8 两个survivor区与一个Eden区的比值为2:8, 一个survivor区占整个新生代的1/10 |
-XX:ParallelGCThreads | 并行收集器的线程数 |
2.3 XX参数
- -XX:+<option> +表示启用这个属性
- -XX:-<option> -表示禁用这个属性
- -XX:<option>=<number> 设置option数值,单位为GB/MB/KB
- -XX:<option>=<String> 设置option字符值
参数 | 描述 |
---|---|
-XX:+PrintGC | 输出GC日志 |
-XX:+PrintGCDetails | 输出GC的详细日志 |
-XX:+PrintGCTimeStamps | 输出GC的时间戳 |
-XX:+PrintGCDateStamps | 输出GC的时间戳(以日期的形式) |
-XX:+PrintHeapAtGC | 在进行GC的前后打印出堆的信息 |
2.4 GC日志浏览
传送门:-》》》IDEA和Eclipse如何查看GC日志《《《---
Demo0305解析
-------------------------------------------------------------------------------------------------------------------------
PSYoungGen(新生代)
total 37888K:新生代总容量为 37888KB
used 3933K:新生代已使用容量 3933KB
- eden space:Eden区
eden space 32768K:Eden区总容量为 32768KB
12% used:使用了 12%
- from space:第一个幸存区 0
from space 5120K:幸存区 0 总容量为 5120KB
0% used:未使用
- to space:第二个幸存区 1
to space 5120K:幸存区 1 总容量为 5120KB
0% used:未使用
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ParOldGen(老年代)
total 179712K:老年代总容量为 179712KB
used 154500K:老年代已使用 154500KB
- object space:对象空间
object space 179712K:对象空间总容量为 179712KB
85% used:使用了 85%
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Metaspace(元空间)
used 3234K:已使用 3234KB
capacity 4496K:容量为 4496KB
committed 4864K:已提交 4864KB
reserved 1056768K:保留了 1056768KB
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
class space(类空间)
used 350K:已使用 350KB
capacity 388K:容量为 388KB
committed 512K:已提交 512KB
reserved 1048576K:保留了 1048576KB
-------------------------------------------------------------------------------------------------------------------------
2.5 GC日志结构
收集器 | 描述 |
---|---|
Serial | 新生代显示DefNew |
ParNew | 新生代显示ParNew |
Parallel Scavenge | 新生代显示PSYoungGen |
Parallel Old | 老年代显示ParoldGen |
G1 | 显示garbage-first heap |
字段 | 原因 |
---|---|
Allocation Failure | 新生代中没有足够的区域存放需要分配的数据 |
Metadata GCThreshold | 元空间区容量不足 |
Ergonomics | JVM自适应调整导致垃圾回收 |
System | 调用了System.gc()方法 |
通过日志看垃圾回收前后情况
- GC日志格式的规律:GC前内存占用->GC后内存占用(该区域内存总大小)
- Minor GC堆内存总容量= 9/10 新生代 + 老年代;survivor区只计算from部分,而JVM默认新生代中Eden区与survivor区的比例为Eden:S0:S1 = 8:1:1