本文共 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编译的速度,默认为23、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=704、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/b99c9ef0eb167.https://www.cnblogs.com/gxyandwmm/p/9456955.html
×××××
转载地址:https://blog.csdn.net/zangzh/article/details/106147613 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!