G1调优常用参数及其作用
- 暂停时间:用
-XX:MaxGCPauseMillis
来指定,默认值200ms。这是一个软性目标,G1会尽量达成,如果达不成,会逐渐做自我调整。对于Young GC来说,会逐渐减少Eden区个数,减少Eden空间那么Young GC的处理时间就会相应减少;对于Mixed GC,G1会调整每次Choose Cset的比例,默认最大值是10%,当然每次选择的Cset少了,所要经历的Mixed GC的次数会相应增加。同时减少Eden的总空间时,就会更加频繁的触发Young GC,也就是会加快Mixed GC的执行频率,因为Mixed GC是由Young GC触发的,或者说借机同时执行的。频繁GC会对对应用的吞吐量造成影响,每次Mixed GC回收时间太短,回收的垃圾量太少,可能最后GC的垃圾清理速度赶不上应用产生的速度,那么可能会造成串行的Full GC,这是要极力避免的。所以暂停时间肯定不是设置的越小越好,当然也不能设置的偏大,转而指望G1自己会尽快的处理,这样可能会导致一次全部并发标记后触发的Mixed GC次数变少,但每次的时间变长,STW时间变长,对应用的影响更加明显。 - Region大小:用
-XX:G1HeapRegionSize
来指定,若未指定则默认最多生成2048块,每块的大小需要为2的幂次方,如1,2,4,8,16,32,最大值为32M。Region的大小主要是关系到Humongous Object的判定,当一个对象超过Region大小的一半时,则为巨型对象,那么其会至少独占一个Region,如果一个放不下,会占用连续的多个Region。当一个Humongous Region放入了一个巨型对象,可能还有不少剩余空间,但是不能用于存放其他对象,这些空间就浪费了。所以如果应用里有很多大小差不多的巨型对象,可以适当调整Region的大小,尽量让他们以普通对象的形式分配,合理利用Region空间。 - 新生代比例:新生代比例有两个数值指定,下限:
-XX:G1NewSizePercent
,默认值5%,上限:-XX:G1MaxNewSizePercent
,默认值60%。G1会根据实际的GC情况(主要是暂停时间)来动态的调整新生代的大小,主要是Eden Region的个数。最好是Eden的空间大一点,毕竟Young GC的频率更大,大的Eden空间能够降低Young GC的发生次数。但是Mixed GC是伴随着Young GC一起的,如果暂停时间短,那么需要更加频繁的Young GC,同时也需要平衡好Mixed GC中新生代和老年代的Region,因为新生代的所有Region都会被回收,如果Eden很大,那么留给老年代回收空间就不多了,最后可能会导致Full GC。 - 并发GC线程数:通过
-XX:ConcGCThreads
来指定,默认是-XX:ParallelGCThreads/4
,也就是在非STW期间的GC工作线程数,当然其他的线程很多工作在应用上。当并发周期时间过长时,可以尝试调大GC工作线程数,但是这也意味着此期间应用所占的线程数减少,会对吞吐量有一定影响。 - 并行GC线程数:通过
-XX:ParallelGCThreads
来指定,也就是在STW阶段工作的GC线程数,其值遵循以下原则:
① 如果用户显示指定了ParallelGCThreads,则使用用户指定的值。
② 否则,需要根据实际的CPU所能够支持的线程数来计算ParallelGCThreads的值,计算方法见步骤③和步骤④。
③ 如果物理CPU所能够支持线程数小于8,则ParallelGCThreads的值为CPU所支持的线程数。这里的阀值为8,是因为JVM中调用nof_parallel_worker_threads接口所传入的switch_pt的值均为8。
④ 如果物理CPU所能够支持线程数大于8,则ParallelGCThreads的值为8加上一个调整值,调整值的计算方式为:物理CPU所支持的线程数减去8所得值的5/8或者5/16,JVM会根据实际的情况来选择具体是乘以5/8还是5/16。
比如,在64线程的x86 CPU上,如果用户未指定ParallelGCThreads的值,则默认的计算方式为:ParallelGCThreads = 8 + (64 - 8) * (5/8) = 8 + 35 = 43。 - 被纳入Cset的Region的存活空间占比阈值:通过
-XX:G1MixedGCLiveThresholdPercent
指定,不同版本默认值不同,有65%和85%。在全局并发标记阶段,如果一个Region的存活对象的空间占比低于此值,则会被纳入Cset。此值直接影响到Mixed GC选择回收的区域,当发现GC时间较长时,可以尝试调低此阈值,尽量优先选择回收垃圾占比高的Region,但此举也可能导致垃圾回收的不够彻底,最终触发Full GC。 - 触发全局并发标记的老年代使用占比:通过
-XX:InitiatingHeapOccupancyPercent
指定,默认值45%,也就是老年代占堆的比例超过45%。如果Mixed GC周期结束后老年代使用率还是超过45%,那么会再次触发全局并发标记过程,这样就会导致频繁的老年代GC,影响应用吞吐量。同时老年代空间不大,Mixed GC回收的空间肯定是偏少的。可以适当调高IHOP的值,当然如果此值太高,很容易导致年轻代晋升失败而出发Full GC,所以需要多次调整测试。 - 触发Mixed GC的堆垃圾占比:通过
-XX:G1HeapWastePercent
指定,默认值5%,也就是在全局标记结束后能够统计出所有Cset内可被回收的垃圾占整对的比例值,如果超过5%,那么就会触发之后的多轮Mixed GC,如果不超过,那么会在之后的某次Young GC中重新执行全局并发标记。可以尝试适当的调高此阈值,能够适当的降低Mixed GC的频率。 - 每轮Mixed GC回收的Region最大比例:通过
-XX:G1OldCSetRegionThresholdPercent
指定,默认10%,也就是每轮Mixed GC附加的Cset的Region不超过
全部Region的10%,最多10%,如果暂停时间短,那么可能会少于10%。一般这个值不需要额外调整。 - 一个周期内触发Mixed GC最大次数:通过
-XX:G1MixedGCCountTarget
指定,默认值8。也就是在一次全局并发标记后,最多接着8此Mixed GC,也就是会把全局并发标记阶段生成的Cset里的Region拆分为最多8部分,然后在每轮Mixed GC里收集一部分。这个值要和上一个参数配合使用,8*10%=80%,应该来说会大于每次标记阶段的Cset集合了。一般此参数也不需额外调整。 - G1为分配担保预留的空间比例:通过
-XX:G1ReservePercent
指定,默认10%。也就是老年代会预留10%的空间来给新生代的对象晋升,如果经常发生新生代晋升失败而导致Full GC,那么可以适当调高此阈值。但是调高此值同时也意味着降低了老年代的实际可用空间。 - 谨慎使用Soft Reference。如果SoftReference过多,会有频繁的老年代收集。-XX:SoftRefLRUPolicyMSPerMB参数,可以指定每兆堆空闲空间的软引用的存活时间,默认值是1000,也就是1秒。可以调低这个参数来触发更早的回收软引用。如果调高的话会有更多的存活数据,可能在GC后堆占用空间比会增加。 对于软引用,还是建议尽量少用,会增加存活数据量,增加GC的处理时间。
- 晋升年龄阈值:通过
-XX:MaxTenuringThreshold
指定,默认值15。一般新生对象经过15次Young GC会晋升到老年代,巨型对象会直接分配在老年代,同时在Young GC时,如果相同age的对象占Survivors空间的比例超过-XX:TargetSurvivorRatio
的值(默认50%),则会自动将此次晋升年龄阈值设置为此age的值,所有年龄超过此值的对象都会被晋升到老年代,此举可能会导致老年代需要不少空间应对此种晋升。一般这个值不需要额外调整。
G1调优常用参数及其作用相关推荐
- Mysql性能调优常用参数配置
全文中一共有常用的(事实上你如果花1-2周阅读.理解.自己动手设一下后是需要这么多参数的)76个参数 可能你从未看到过这样的一篇集中火力式的把mysql参数列了这么全的文章.因此这一篇是汇集了最精华和 ...
- JVM调优常用参数配置
2019独角兽企业重金招聘Python工程师标准>>> 堆配置 -Xms:初始堆大小 -Xms:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n: ...
- Java虚拟机学习总结(4)—— JVM 性能调优常用参数详解
前言 在JVM性能调优时有三个组件: 堆大小调整(内存最够大的话,尽量搞大点) 垃圾收集器调整 JIT 编译器(比较深,需要掌握源码才能更好的优化更加底层) 大多数调优选项都与调整堆大小和为您的情况选 ...
- java gc调优常用参数_常用JVM调优参数
JVM调优有许多参数优化,下面整理了一些我自己能够理解的参数 -XX:AutoBoxCacheMax -XX:+AlwaysPreTouch CMSInitiatingOccupancyFractio ...
- JVM调优和参数配置
1.JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots 答:什么是垃圾:简单的说就是内存中已经不再被使用到的空间就是垃圾 要进行垃圾回收,如何判断一个对象是否可以被回 ...
- Oracle Hints,Oracle并行模式(Parallel) /*+parallel(t,4)*/ 在SQL调优中的重要作用
/*+parallel(t,4)*/在SQL调优中的重要作用! 2013年11月17日 12:59:24 雾里看花5566 阅读数:5422更多 个人分类: 数据库-oracle 谈谈HINT /*+ ...
- jvm监控调优常用命令
jvm监控调优常用命令 转载于:https://www.cnblogs.com/likun10579/p/6403324.html
- 应用调优常用技巧-線程池
应用调优常用技巧-線程池 应用调优常用技巧 - 线程池 線程池的好處 核心API-操作類 核心API-監控類 2-2 线程池BlockingQueue详解.选择与调优 調優技巧 2-3 线程池Sche ...
- 通过大规模机器学习自动调优数据库参数
目录 1. 引言 2. 挑战 3. 系统概览 3.1 举例 3.2 假设和限制 4. 工作负载识别 4.1 统计收集 4.2 修剪冗余监控指标 5. 识别重要的参数 5.1 使用Lasso进行特征选择 ...
最新文章
- 弹性布局,自动按比例居中
- ArgoCD + KubeVela:以开发者为中心的 GitOps
- springboot项目打包成war并在tomcat上运行的步骤
- H5开发开发利器——flex
- [译]Speeding up your PHP scripts
- 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
- leetcode199. 二叉树的右视图(层序遍历03)
- JS对象拷贝:深拷贝和浅拷贝
- 一维卷积神经网络原理,卷积神经网络原理简述
- 解决硬盘打不开的问题
- SAP用户研讨会嘉宾发言稿——SAP中国产品技术平台咨询经理丁晓枫
- ubuntu 校准时间_ubuntu server自动校正时间 | 学步园
- 搜索引擎的技术发展趋势
- 周爱民:真正的架构师是没有title的
- ESP8266 WIFI模块学习之路(7)——自写Android手机APP接受单片机数据
- windows server2012软路由
- esp8266 SDK相关资料
- C++ - 多态(2) | 虚表的打印、单继承与多继承的虚表
- 商业结算中的本票、支票、汇票
- python2和python3实现在图片上加汉字
热门文章
- 牛刀小试基本语法,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本语法和变量的使用EP02
- 论OpenVZ与KVM的区别
- 如何制作一个自定义的winpe?
- 剑指OFFER——正则表达式匹配
- 详谈机器视觉大师脚本编程
- 科技云报道:超融合遍地开花,用户离“云计算自由”却依然很远?
- java删除图片杂色_Java生成图片,Graphics生成图片,Graphics2D生成图片,Awt生成图片
- MY DAILY LIFE
- Android OpenGL ES 基础原理
- 字体随浏览器缩放变化