【杂记】JVM调优

目录

前言

JVM常用命令行工具

1.1 jps命令

1.1.1 jps :显示虚拟机执行主类名称和进行号

1.1.2 jps -l :用于输出主类的全名,如果进程执行的是jar包,输出jar包的全名称 

1.1.3 jps -v :用于输出虚拟机进程启动时JVM的参数

1.1.4 jps命令总结 

1.2 jstat命令

1.2.1 jstat -class [进程号] :类加载统计

1.2.2 jstat -gc [进程号] :垃圾回收统计

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 jinfo命令

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 jstack命令

1.4.1 jstack [进程号] :查看当前进程的线程快照,是否存在线程死锁问题

1.5 jconsole命令打开可视化工具

1.6 jvisualvm命令打开可视化工具

JVM常见运行参数

2.1 标注参数

2.1.1 java -help :显示标注参数指令

2.1.2 java -version :显示产品版本

2.2 X参数

2.2.1 java -X :显示X参数指令

 2.3 XX参数

2.4 GC日志浏览

2.5 GC日志结构


前言

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命令总结
命令描述
jps命令用于查看所有Java进程
jps显示虚拟机执行主类名称以及进程的本地虚拟机唯一ID
jps -l相比于1中,显示的信息更全面,如果进程执行的是jar包,会显示jar包的名称
jps -v显示JVM虚拟机进程启动时所有的参数

1.2 jstat命令

“JVM Statistics Monitoring Tool”, 用于监视虚拟机各种运行状态信息;

1.2.1 jstat -class [进程号] :类加载统计

jstat -class [进程号] 的描述
字段含义
Loaded已加载类的数量
Bytes加载类占用的内存大小,单位为字节(B)
Unloaded卸载类的数量
Bytes卸载类释放的内存大小,单位为字节(B)
Time类加载和卸载所花费的时间,单位为毫秒(ms)

1.2.2 jstat -gc [进程号] :垃圾回收统计

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 [进程号] :堆内存统计

 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 [进程号] :元空间统计

jstat -gcmetacapacity [进程号] 的描述
字段含义
MCMN最小元数据容量(KB)
MCMX最大元数据容量(KB)
MC当前元空间大小(KB)
CCSMN最小压缩类空间大小(KB)
CCSMX最大压缩类空间大小(KB)
CCSC当前压缩类空间大小(KB)
YGC从应用程序启动到采样时新生代垃圾回收次数
FGC从应用程序启动到采样时老年代垃圾回收次数
FGCT从应用程序启动到采样时老年代垃圾回收所用时间(秒)
GCT垃圾回收总时间 (秒)

1.2.5 jstat -gcnew [进程号] :新生代统计

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 [进程号] :老年代统计

jstat -gcold [进程号] 的描述
字段含义
MC当前元数据空间大小(KB)
MU元空间(Metaspace)已使用的容量
CCSC压缩类空间大小(KB)
CCSU压缩类空间已使用大小 (KB)
OC老年代的容量(KB)
OU老年代已使用空间 (KB)
YGC从应用程序启动到采样时新生代垃圾回收次数
FGC从应用程序启动到采样时老年代垃圾回收次数
FGCT从应用程序启动到采样时老年代垃圾回收所用时间(秒)
GCT垃圾回收总时间 (秒)

1.2.7 jstat -gcutil [进程号] :垃圾回收统计和内存使用统计

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参数指令

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:SurvivorRatioEden区与幸存区(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参数的描述
参数描述
-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元空间区容量不足
ErgonomicsJVM自适应调整导致垃圾回收
System调用了System.gc()方法

通过日志看垃圾回收前后情况

  • GC日志格式的规律:GC前内存占用->GC后内存占用(该区域内存总大小)
  • Minor GC堆内存总容量= 9/10 新生代 + 老年代;survivor区只计算from部分,而JVM默认新生代中Eden区与survivor区的比例为Eden:S0:S1 = 8:1:1
  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值