-Xms2048m 初始堆大小
默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.
调整同-Xmx一样可提高性能,防止使用时再申请
-Xmx2048m 最大堆大小
默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn512 年轻代大小
注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。
整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.
增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-Xss1M 每个线程的堆栈大小
JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,根据应用线程所所需调整
-XX:NewRatio=1 年轻代与年老代的比值
-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
如:Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置
-XX:SurvivorRatio
Eden区与Survivor区的大小比值, 默认: 8:1:1
-XX:MetaspaceSize=128 初始元数据空间大小
JDK1.8 替代 -XX:PermSize=16m
-XX:MaxMetaspaceSize=128m 最大元数据空间大小
JDK1.8 替代 -XX:MaxPermSize=16m
-XX:MaxTenuringThreshold=15 设置垃圾最大年龄,
老年代对象较多的应用可适当减少此值,以提高年轻代GC效率
-XX:ReservedCodeCacheSize=240M
设置CodeCache大小,满了之后就不再编译。默认开多层编译240M,可以在JMX里看看CodeCache的大小。 JIT编译的代码都放在CodeCache中,若空间不足则JIT无法继续编译,并且会去优化,比如编译执行改为解释执行,性能会降低
-XX:+UseParallelGC 吞吐量优先,适配cpu密集型,交互时效要求不高情景适用
指定在新生代使用Parallel Scanvenge,并行收集,暂停 app threads
-XX:+UseConcMarkSweepGC 使用CMS内存收集器(年老代),低延迟
-XX:+UseG1GC 使用G1内存收集器,以上3选1
-XX:ParallelGCThreads=2 并行收集器的线程数
设置STW(Stop-The-World机制)工作线程数的值。
将 n 的值设置为逻辑处理器的数量。n 的值与逻辑处理器的数量相同,最多为 8。
大于8时设置为5/8
-XX:ConcGCThreads=1 设置并行标记的线程数
将 n 设置为并行垃圾回收线程数 (ParallelGCThreads) 的 1/4 左右
-XX:CICompilerCount
设置的相对较大可以一定程度提升JIT编译的速度,默认为2
-XX:+UseConcMarkSweepGC:启用CMS垃圾收集器
-XX:CMSInitiatingOccupancyFraction=68
老年代堆空间的使用率超过该值会触发CMS
默认值:意味着第一次CMS垃圾收集会在老年代被占用68%时被触发
与 -XX:+UseCMSInitiatingOccupancyOnly 两个参数需要配合使用,否则第一个参数的68只是一个参考值,JVM会重新计算GC的时间。
-XX:G1HeapRegionSize=4M
设置的G1区域的大小。值是2的幂,范围是1MB到32MB之间。
目标是根据最小的Java堆大小划分出约 2048 个区域。
-XX:MaxGCPauseMillis=200
为所需的最长暂停时间设置目标值。默认值是200毫秒。
-XX:G1NewSizePercent=5
设置要用作年轻代大小最小值的堆百分比。默认值是 Java 堆的 5%。
这是一个实验性的标志。需要解锁
解锁方法是:在命令行中的实验性标志前,显式地设置 -XX:+UnlockExperimentalVMOptions。
例如:java -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=10
-XX:G1MaxNewSizePercent=60
年轻代大小最大值的堆大小百分比,默认值是60%,这是实验性的标志。
-XX:InitiatingHeapOccupancyPercent=45
设置触发标记周期的Java堆占用率阈值。默认占用率是整个Java堆的45%。
-XX:+UseCompressedOops -XX:CompressedClassSpaceSize=128m 压缩
jdk1.8 默认垃圾收集器查看
java -XX:+PrintFlagsFinal
可以看到1.8默认的是 UseParallelGC
ParallelGC 默认的是 Parallel Scavenge(新生代)+ Parallel Old(老年代)
在JVM中是+XX配置实现的搭配组合:
(1)UseSerialGC 表示 “Serial” + "Serial Old"组合
(2)UseParNewGC 表示 “ParNew” + “Serial Old”
(3)UseConcMarkSweepGC 表示 “ParNew” + “CMS”. 组合,“CMS” 是针对旧生代使用最多的
(4)UseParallelGC(或UseParallelOldGC) 表示 “Parallel Scavenge” + "Parallel Old"组合
(5)UseG1GC 表示
(6)ZGC JDK11开始
在实践中使用UseConcMarkSweepGC 表示 “ParNew” + “CMS” 的组合是经常使用的
根据jvm参数开头可以区分参数类型,共三类:“-”、“-X”、“-XX”,
(1)标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
例子:-verbose:class,-verbose:gc,-verbose:jni……
(2)非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
例子:Xms20m,-Xmx20m,-Xmn20m,-Xss128k……
(3)非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
例子:-XX:+PrintGCDetails,-XX:-UseParallelGC,-XX:+PrintGCTimeStamps……
补充3: G1示例:
-Xms2048m -Xmx2048m -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=50 -XX:ParallelGCThreads=2 -XX:ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=30 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=4m -XX:+UseCompressedOops -XX:CompressedClassSpaceSize=128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+AlwaysPreTouch -XX:+UnlockDiagnosticVMOptions
实际使用中,-XX:InitiatingHeapOccupancyPercent=30与-XX:G1MaxNewSizePercent=50值接近时年轻代收集耗时明显增长.
参考文献:
1.https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
2.https://www.oracle.com/cn/technical-resources/articles/java/g1gc.html
3.https://www.jianshu.com/p/4e99912ce840
4.http://ifeve.com/useful-jvm-flags-part-7-cms-collector/
5.https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
6.https://www.jianshu.com/p/b99c9ef0eb16