JVM参数详解
发布日期:2021-06-29 03:37:53 浏览次数:3 分类:技术文章

本文共 5831 字,大约阅读时间需要 19 分钟。

JVM参数详解

JVM参数优化、生成

G1回收器的参数设置

-XX:+UseG1GC: 手动指定使用G1收集器执行内存回收任务。
-XX:G1HeapRegionSize: 设置每个Region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分出约2048个区域。默认是堆内存的1/2000。
-XX:MaxGCPauseMillis: 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到)。默认值是200ms。
-XX:ParallelGCThread: 设置STW时GC线程数的值。最多设置为8。
-XX:ConcGCthreads: 设置并发标记的线程数。将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右。
-XX:InitiatingHeapOccupancyPercent: 设置触发并发GC周期的Java堆占用率阈值。超过此值,就触发GC。默认值是45。
G1回收器的常见操作步骤
G1的设计原则就是简化JVM性能调优,开发人员只需要简单的三步即可完成调优:
第一步: 开启G1垃圾收集器
第二步: 设置堆的最大内存
第三步: 设置最大的停顿时间
G1中提供了三种垃圾回收模式: YoungGC、Mixed GC和Full GC,在不同的条件下被触发。

链接:https://www.jianshu.com/p/8cb46cb26b89

一.参数详解

1、基本参数

-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无法继续编译,并且会去优化,比如编译执行改为解释执行,性能会降低

2、并行收集器通用参数(主流并行收集器)

-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

3、CMS

-XX:+UseConcMarkSweepGC:启用CMS垃圾收集器

-XX:CMSInitiatingOccupancyFraction=68
老年代堆空间的使用率超过该值会触发CMS
默认值:意味着第一次CMS垃圾收集会在老年代被占用68%时被触发
与 -XX:+UseCMSInitiatingOccupancyOnly 两个参数需要配合使用,否则第一个参数的68只是一个参考值,JVM会重新计算GC的时间。

-XX:+UseConcMarkSweepGC // 使用 CMS 收集器

组合1

-XX:+UseCMSCompactAtFullCollection //意思是在Full GC之后再次STW,停止工作线程,整理内存空间
XX:+CMSFullGCsBeforeCompaction=0 //表示在进行多少次Full GC之后进行内存碎片整理,默认为0
组合2
-XX:CMSInitiatingOccupancyFraction=70 // 当老年代达到70%时,触发CMS垃圾回
-XX:+UseCMSInitiatingOccupancyOnly //配合 =70使用,否则=70不起作用

浮动垃圾问题:工作线程和回收线程并行,当工作线程产生的新的对象放入老年代不能放下时就出引起CMS回收降级为serial串行回收。所以要保证不产生Concurrent Mode Failure问题。

可以尝试依赖公式配置 CMSInitiatingOccupancyFraction=(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn
也是就:(最大堆内存 - 新生代)x 剩余百分比 要大于或等 xmn,这样就能保证 新生代的全部跑到老年代也不会降级为串行回收。这个公式有待进一步验证。

CMS存在的问题参考:

CMS 示例

-Xms4096m -Xmx4096m -XX:MaxMetaspaceSize=512m
-XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=4 -XX:ConcGCThreads=1
##以下两个位置不可颠倒,且后面的没有加没
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70

4、G1

-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 压缩

补充1:默认收集器查看

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” 的组合是经常使用的

补充2:jvm参数分类

根据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值接近时年轻代收集耗时明显增长.

示例2:export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms4096m -Xmx4096m -XX:+UseG1GC -XX:ParallelGCThreads=4 -XX:CICompilerCount=4 -XX:G1HeapRegionSize=8m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause -Xloggc:/export/Logs/jvm/gc.log -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300"

参考文献:

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

7.https://www.cnblogs.com/gxyandwmm/p/9456955.html

××××× 

转载地址:https://blog.csdn.net/zangzh/article/details/106147613 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:spring引入多个xml文件
下一篇:Arrays.asList() 不能被修改 包括add 及iterator.remove()

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月06日 07时23分38秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章