JVM常用参数
标准参数
标准参数不会随着JDK版本升级而改变。
- -version
- -help
- -server
- -cp
-X参数
非标准化参数,可能会随着JDK版本变动。
- -Xint:解释执行
- -Xcomp:第一次使用就编译本地代码
- -Xmixed:混合模式,JVM自己来决定
-XX参数
用的最多的参数,也是非标准化参数,主要用于JVM调优和Debug。
(1)Boolean类型
格式:-XX:[+-]<name>
- +或-表示启用或者禁用name属性
(2)非Boolean类型
格式:-XX<name>=<value>
- 表示name属性值是value
(3)其它类型
-Xms1000M 等价于 -XX:InitialHeapSize=1000M
-Xmx1000M 等价于 -XX:MaxHeapSize=1000M
-Xss100 等价于 -XX:ThreadStackSize=100
查看参数
java -XX:+PrintFlagsFinal -version > flags.txt
"="表示默认值,“:=”表示被用户或者JVM修改后的值
常用参数及其含义
参数 | 含义 | 说明 |
---|---|---|
-XX:CICompilerCount=3 | 最大并行编译数 | 如果设置大于1,虽然编译速度会提高,但是同样影响系统稳定性,会增加JVM崩溃的可能 |
-XX:InitialHeapSize=100M | 初始化堆大小 | 简写-Xms100M |
-XX:MaxHeapSize=100M | 最大堆大小 | 简写-Xms100M |
-XX:NewSize=20M | 设置年轻代的大小 | |
-XX:MaxNewSize=50M | 年轻代最大大小 | |
-XX:OldSize=50M | 设置老年代大小 | |
-XX:MetaspaceSize=50M | 设置方法区大小 | |
-XX:MaxMetaspaceSize=50M | 方法区最大大小 | |
-XX:+UseParallelGC | 使用UseParallelGC | 新生代,吞吐量优先 |
-XX:+UseParallelOldGC | 使用UseParallelOldGC | 老年代,吞吐量优先 |
-XX:+UseConcMarkSweepGC | 使用CMS | 老年代,停顿时间优先 |
-XX:+UseG1GC | 使用G1GC | 新生代,老年代,停顿时间优先 |
-XX:NewRatio | 新老生代的比值 | 比如-XX:Ratio=4,则表示新生代:老年代=1:4,也就是新生代占整个堆内存的1/5 |
-XX:SurvivorRatio | 两个S区和Eden区的比值 | 比如-XX:SurvivorRatio=8,也就是(S0+S1):Eden=2:8,也就是一个S占整个新生代的1/10 |
-XX:+HeapDumpOnOutOfMemoryError | 启动堆内存溢出打印 | 当JVM堆内存发生溢出时,也就是OOM,自动生成dump文件 |
-XX:HeapDumpPath=heap.hprof | 指定堆内存溢出打印目录 | 表示在当前目录生成一个heap.hprof文件 |
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:g1-gc.log | 打印出GC日志 | 可以使用不同的垃圾收集器,对比查看GC情况 |
-Xss128k | 设置每个线程的堆栈大小 | 经验值是3000-5000最佳 |
-XX:MaxTenuringThreshold=6 | 提升年老代的最大临界值 | 默认值为 15 |
-XX:InitiatingHeapOccupancyPercent | 启动并发GC周期时堆内存使用占比 | G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示”一直执行GC循环”. 默认值为 45. |
-XX:G1HeapWastePercent | 允许的浪费堆空间的占比 | 默认是10%,如果并发标记可回收的空间小于10%,则不会触发MixedGC。 |
-XX:MaxGCPauseMillis=200ms | G1最大停顿时间 | 暂停时间不能太小,太小的话就会导致出现G1跟不上垃圾产生的速度。最终退化成Full GC。所以对这个参数的调优是一个持续的过程,逐步调整到最佳状态。 |
-XX:ConcGCThreads=n | 并发垃圾收集器使用的线程数量 | 默认值随JVM运行的平台不同而不同 |
-XX:G1MixedGCLiveThresholdPercent=65 | 混合垃圾回收周期中要包括的旧区域设置占用率阈值 | 默认占用率为 65% |
-XX:G1MixedGCCountTarget=8 | 设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数 | 默认8次混合垃圾回收,混合回收的目标是要控制在此目标次数以内 |
-XX:G1OldCSetRegionThresholdPercent=1 | 描述Mixed GC时,Old Region被加入到CSet中 | 默认情况下,G1只把10%的Old Region加入到CSet中 |
JVM常用命令
jps
jps命令用于查看java进程。
jinfo
(1)实时查看和调整JVM配置参数
(2)查看进程运行信息
# 查看某个java进程的name属性值
jinfo -flag name PID
(3)实时修改参数
只有被标记为manageable的flags可以被实时修改
jinfo -flag [+|-] PID
jinfo -flag <name>=<value> PID
(4)查看之前赋值过的参数
jinfo -flags PID
jstat
(1)查看虚拟机性能统计信息
(2)查看类装载信息
# 查看某个java进程的类装载信息,每1000ms输出一次,共输出10次
jstat -class PID 1000 10
(3)查看垃圾收集信息
jstat -gc PID 1000 10
jstack
jstack 用于查看线程堆栈信息
jstack PID
jmap
(1)生成堆存储快照
(2)打印堆内存相关信息
jmap -heap PID
(3)dump出堆内存相关信息
jmap -dump:format=b,file=heap.hprof PID
(4)内存溢出时自动dump
添加如下两个JVM参数:
- -XX:+HeadDumpOnOutOfMemoryError
- -XX:HeapDumpPath=heap.hprof
JVM中常用参数与垃圾收集器常用参数
-Xmx:设置堆的最大值,一般为操作系统的2/3
-Xms:设置堆的初始值,一般和Xmx一样大避免扩容
-Xmn:年轻代的大小,默认占堆的1/3,G1中会自动设置
-Xss:设置栈的大小,默认1M
-XX:+UseTLAB 使用TLAB,默认开启
-XX:+PrintTLAB 打印TLAB的使用情况
-XX:TLABSize 设置TLAB大小
-XX:+DisableExplicitGC 启用用于禁用对的调用处理的选项System.gc()
-XX:+PrintGC 查看GC基本信息
-XX:+PrintGCDetails 查看GC详细信息
-XX:+PrintHeapAtGC 每次GC后都打印信息
-XX:+PrintGCTimeStamps 启用在每个GC上打印时间戳的功能
-XX:+PrintGCApplicationConcurrentTime 打印应用程序时间(低)
-XX:+PrintGCApplicationStoppedTime 打印暂停时长(低)
-XX:+PrintReferenceGC 记录回收了多少种不同引用类型的引用(重要性低)
-verbose:class 类加载详细过程
-XX:+PrintVMOptions 可在程序运行时,打印虚拟机接受到的命令行显示参数
-XX:+PrintFlagsFinal -XX:+PrintFlagsInitial 打印所有的JVM参数、查看所有JVM参数启动的初始值(必须会用)
-XX:MaxTenuringThreshold 升代(分代)年龄,这个值在CMS 下默认为 6,G1 下默认为 15,这个值和我们前面提到的对象提升有关,改动效果会比较明显。对象的年龄分布可以使用 -XX:+PrintTenuringDistribution 打印,如果后面几代的大小总是差不多,证明过了某个年龄后的对象总能晋升到老生代,就可以把晋升阈值设小
Parallel常用参数
设置Eden区空间大小与Survivor空间大小的比率,默认情况为8。
-XX:SurvivorRatio
大对象到底多大,大于这个值的参数直接放在老年代
-XX:PreTenureSizeThreadhold
升代年龄,最大15,并行收集器的默认为15,CMS默认为6
-XX:MaxTenuringThreadhold
并行收集器的线程数,同样适用于CMS,一般与CPU核数相同或者N+1
-XX:+ParallelGCThreads
自动选择堆中各区域大小比例
-XX:+UseAdaptiveSizePolicy
CMS常用参数
启用CMS
-XX:+UseConcMarkSweepGC
并行收集器的线程数
-XX:+ParallelGCThreads
使用多少比例的老年代后开始CMS垃圾收集,默认是68%,如果频繁发生SerialOld停顿,应该调小
-XX:CMSInitiatingOccupancyFraction
Full GC时进行压缩
-XX:+UseCMSCompactAtFullCollection
多少次Full GC之后进行压缩
-XX:CMSFullGCsBeforeCompaction
使用并发标记扫表CMS垃圾收集器时,启动类卸载,默认启用
-XX:+CMSClassUnloadingEnabled
停顿时间,是一个建议时间,GC会尝试用各种手段达到这个时间,比如减小年轻代
-XX:MAxGCPauseMillis
G1常用参数
启用G1
-XX:+UseG1GC
设置最大GC暂停时间的目标(以毫秒为单位)。这是一个软目标,并且JVM将尽最大的努力(G1会尝试调整Young区的块数来)来实现它。默认情况下,没有最大暂停时间值。
-XX:MaxGCPauseMillis
GC的间隔时间
-XX:GCPauseIntervalMillis
单个Region大小,取值是1M-32M,建议逐渐增大该值,1 2 4 8 16 32。随着size增加,垃圾的存活时间更长,GC间隔更长,但每次GC的时间也会更长-XX:G1NewSizePercent 新生代最小比例,默认为1/2000
-XX:+G1HeapRegionSize 你的堆内存小于2G的时候 4C8G起步
新生代最大比例,默认为60%
-XX:G1MaxNewSizePercent
时间建议比例,G1会根据这个值调整堆空间
-XX:GCTimeRatioGC
初始标记线程数量
-XX:ConcGCThreads
启动G1的堆空间占用比例,根据整个堆的占用而触发并发GC周期
-XX:InitiatingHeapOccupancyPercent