深入浅出JVMGC(4)常用GC参数介绍

更新时间:2023-06-04 11:01:03 阅读: 评论:0

深⼊浅出JVMGC(4)常⽤GC参数介绍
# 前⾔
从前⾯的3篇⽂章中,我们分析了5个垃圾收集器,还有⼀些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪⾥出现的问题,然后再根据出现的问题进⾏调优,⽽调优的⼿段就是 JVM 提供给我们的那些参数或者说选项,这些参数将会改变 GC 的运⾏⽅式。因此,他们显得极为重要。
我们将每⼀个垃圾收集器相关的参数⼀个⼀个娓娓道来,注意,楼主推荐⼀个⼩程序:前阿⾥ JVM ⼤神寒泉⼦的公众号⾥⾯有个⼩程序------JVM Pocket,这个⼩程序介绍了所有的 JVM 参数的作⽤,你可以在⾥⾯搜索你想知道的参数,也可以把你了解的参数写上去供⼤家参考。公众号:lovestblog。
值得注意的⼀点是,这些参数可能会重复,还记得我们之前的那张图吗,楼主觉得有必要再发⼀次:
可以看到,这些收集器会有⼀些重复,⽽且,某些参数也是会作⽤于所有的处理器,因此,我们下⾯的介绍可能会有⼀些重复。
o型血的人是什么性格还有⼀点就是,JVM 为我们设置了很多默认的参数,但是,如果可以的话,还是建议使⽤显式的声明,这样更能表达意图。否则,别⼈不⼀定知道我们是否知道这些默认值。
我们开始我们的参数之旅吧!
# 1. Serial 收集器参数
串⾏收集器,client 的默认收集器,分为年轻代 Serial 和⽼年代 Serial Old 收集器。
1. -XX:+USerialGC 这个参数就是可以指定使⽤新⽣代串⾏收集器和⽼年代串⾏收集器, “+” 号的意思是ture,开启,反之,如果是
“-”号,则是关闭。
2. -XX:+UParNewGC 新⽣代使⽤ ParNew 回收器,⽼年代使⽤串⾏收集器。
3. -XX:+UParallelGC 新⽣代私⽤ ParallelGC 回收器,⽼年代使⽤串⾏收集器。
⽽ Serial 收集器出现的⽇志为 DefNew .
# 2. ParNew 收集器参数
并⾏收集器是 Serial 的多线程版本,在 CPU 并⾏能⼒强⼤的计算机上有很⼤优势。
其中:
1. -XX:+UParNewGC 上⾯说过了,新⽣代使⽤ ParNew 收集器,⽼年代使⽤串⾏收集器。
2. -XX:+UConcMarkSweepGC: 新⽣代使⽤ ParNew 回收器,⽼年代使⽤ CMS。
3. -XX:ParallelGCThreads={value} 这个参数是指定并⾏ GC 线程的数量,⼀般最好和 CPU 核⼼数量相当。默认情况下,当 CPU 数量
⼩于8, ParallelGCThreads 的值等于 CPU 数量,当 CPU 数量⼤于 8 时,则使⽤公式:3+((5*CPU)/ 8);同时这个参数只要是并⾏ GC 都可以使⽤,不只是 ParNew。
⽽ ParNew 的 GC ⽇志则表吸纳出 ParNew。
# 3. PS 收集器参数
全称 Parallel Scavenge 收集器,该收集器是 Java 8 的默认收集器,因为它能够根据系统当前状态给出吞吐量最⾼的GC 配置。所以,在⼀些⼿⼯调优复杂的场合或者对实时性要求不⾼的场合,可以使⽤该处理器。
有哪些参数呢?
马绍尔群岛战役
1. -XX:MaxGCPauMillis 设置最⼤垃圾收集停顿时间,他的值是⼀个⼤于0的整数。ParallelGC ⼯作时,会调整 Java 堆⼤⼩或者其他
的⼀些参数,尽可能的把停顿时间控制在 MaxGCPauMillis 以内。如果为了将停顿时间设置的很⼩,将此值也设置的很⼩,那么 PS 将会把堆设置的也很⼩,这将会到值频繁 GC ,虽然系统停顿时间⼩了,但总吞吐量下降了。
2. -XX:GCTimeRatio 设置吞吐量⼤⼩,他的值是⼀个0 到100之间的整数,假设 GCTimeRatio 的值是 n ,那么系统将花费不超过
1/(1+n) 的时间⽤于垃圾收集,默认 n 是99,即不超过1% 的时间⽤于垃圾收集。
3. -XX:+UParallelGC 新⽣代使⽤ ParallelGC 回收器,⽼年代使⽤串⾏回收器。
4. -XX:+UParallelOldGC 新⽣代使⽤ ParallelGC 回收器,⽼年代使⽤ ParallelOldGC 回收器。
5. -XX:UAdaptiveSizePolicy: 打开⾃适应策略。在这种模式下,新⽣代的⼤⼩,eden 和 Survivor 的⽐例,晋升⽼年代的对象年龄等参
数会被⾃动调整。以达到堆⼤⼩,吞吐量,停顿时间的平衡点。
聪明的同学相⽐看出来了,1 和 2 两个参数是⽭盾的。因为吞吐量和停顿时间就是⽭盾的。所以,要根据应⽤的特性来进⾏设置,以达到最优⽔平。
同时,Parallel Old 收集器也是⼀种关注吞吐量的并⾏的⽼年代回收器。
1. -XX:+UParallelOldGC 新⽣代使⽤ ParallelGC 回收器,⽼年代使⽤ ParallelOldGC 回收器。该参数可以启⽤ ParallelOldGC。
2. -XX:ParallelGCGThreads 同时可以指定该参数设置并⾏线程数量。
竞争⽽ PS 处理器的 GC ⽇志则是 PSYoungGen。
# 4. CMS 收集器参数
CMS 处理器关注的是停顿时间。全称 Concurrent Mark Sweep。因为该处理器较为复杂,因此可以使⽤较多参数。
1. -XX:-CMSPrecleaningEnabled 不进⾏预清理,度过我们之前的⽂章的都知道,CMS 在并发标记和重新标记的这段时间内,会有⼀个
预清理的⼯作,⽽这个通过会尝试5秒之内等待来⼀次 YGC。以免在后⾯的重新标记阶段耗费⼤量时间来标记新⽣代的对象。
2. -XX:+UConcMarkSweepGC 此参数将启动 CMS 回收器。默认新⽣代是 ParNew,也可以设置 Serial 为新⽣代收集器。该参数等价
于 -Xconcgc。
3. -XX:ParallelGCThreads 由于是并⾏处理器,当然也可以指定线程数。默认并发线程数是:(ParallelGCThreads + 3)/ 4)。
4. -XX:ConcGCThreads 或者 -XX:ParallelCMSThreads ;除了上⾯设置线程的⽅式,你也可以通过这个两个参数任意⼀个⼿⼯设定
CMS 并发线程数。
婴儿拉绿屎的解决办法
5. -XX:CMSInitiatingOccupancyFraction 由于 CMS 回收器不是独占式的,在垃圾回收的时候应⽤程序仍在⼯作,所以需要留出⾜够的内
存给应⽤程序,否则会触发 FGC。⽽什么时候运⾏ CMS GC 呢?通过该参数即可设置,该参数表⽰的是⽼年代的内存使⽤百分⽐。
当达到这个阈值就会执⾏ CMS。默认是68。如果⽼年代内存增长很快,建议降低阈值,避免 FGC,如果增长慢,则可以加⼤阈值,减少 CMS GC 次数。提⾼吞吐量。
6. -XX:+UCMSCompactAtFullCollection 由于 CMS 使⽤标记清理算法,内存碎⽚⽆法避免。该参数指定每次 CMS 后进⾏⼀次碎⽚
契诃夫整理。
7. -XX:CMSFullGCsBeforeCompaction 由于每次进⾏碎⽚整理将会影响性能,你可以使⽤该参数设定多少次 CMS 后才进⾏⼀次碎⽚整
理,也就是内存压缩。
8. -XX:+CMSClassUnloadingEnabled 允许对类元数据进⾏回收。
9. -XX:CMSInitiatingPermOccupancyFraction 当永久区占⽤率达到这⼀百分⽐时,启动 CMS 回收(前提是 -
XX:+CMSClassUnloadingEnabled 激活了)。
10. -XX:UCMSInitiatingOccupancyOnly 表⽰只在到达阈值的时候才进⾏ CMS 回收。
11. XX:CMSWaitDuration=2000 由于CMS GC 条件⽐较简单,JVM有⼀个线程定时扫描Old区,时间间隔可以通过该参数指定(毫秒单
位),默认是2s。
CMS 的 GC ⽇志就是 CMS。
# 5. G1 收集器参数
作为 Java 9 的默认垃圾收集器,该收集器和之前的收集器⼤不相同,该收集器可以⼯作在young 区,也可以⼯作在 old 区。有哪些参数呢?
催促函1. -XX:+UG1GC 开启 G1 收集器。
2. -XX:MaxGCPauMillis ⽤于指定最⼤停顿时间,如果任何⼀次停顿超过这个设置值时,G1 就会尝试调整新⽣代和⽼年代的⽐例,调
整堆⼤⼩,调整晋升年龄的⼿段,试图达到⽬标。和 PS ⼀样,停顿时间⼩了,对应的吞吐量也会变⼩。这点值得注意。
3. -XX:ParallelGCThreads 由于是并⾏并发的,可以指定GC ⼯作线程数量。
表达悲伤的诗句4. -XX:InitiatingHeapOccupancyPercent 该参数可以指定当整个堆使⽤率达到多少时,触发并发标记周期的执⾏。默认值时45,即当堆
的使⽤率达到45%,执⾏并发标记周期,该值⼀旦设置,始终都不会被 G1修改。也就是说,G1 就算为了满⾜ MaxGCPauMillis 也不会修改此值。如果该值设置的很⼤,导致并发周期迟迟得不到启动,那么引起 FGC 的⼏率将会变⼤。如果过⼩,则会频繁标记,GC 线程抢占应⽤程序CPU 资源,性能将会下降。
5. -XX:GCPauIntervalMillis 设置停顿时间间隔。
# 6. ⼀些通⽤参数
在 GC 调优中,还有⼀些通⽤的参数。通常是我们的好帮⼿。
1. -XX:-+DisableExplicitGC 禁⽤ (),由于该⽅法默认会触发 FGC,并且忽略参数中的 UG1GC 和
UConcMarkSweepGC,因此必要时可以禁⽤该⽅法。
2. -XX:+ExplicitGCInvokesConcurrent 该参数可以改变上⾯的⾏为,也就是说,() 后不使⽤ FGC ,⽽是使⽤配置的并发收集
器进⾏并发收集。注意:使⽤此选项就不要使⽤上⾯的选项。
3. -XX:-ScavengeBeforeFullGC 由于⼤部分 FGC 之前都会 YGC,减轻了 FGC 的压⼒,缩短了 FGC 的停顿时间,但也可能你不需要这
个特性,那么你可以使⽤这个参数关闭,默认是 ture 开启。
4. -XX:MaxTenuringThreshold={value} 新⽣代 to 区的对象在经过多次 GC 后,如果还没有死亡,则认为他是⼀个⽼对象,则可以晋升到
⽼年代,⽽这个年龄(GC 次数)是可以设置的,有就是这个参数。默认值时15。超过15 则认为是⽆限⼤(因为age变量时4个 bit,超过15⽆法表达)。但该参数不是唯⼀决定对象晋升的条件。当 to 区不够或者改对象年龄已经达到了平均晋升值或者⼤对象等等条件。
5. -XX:TargetSurvivorRatio={value} 决定对何时晋升的不仅只有 XX:MaxTenuringThreshold 参数,如果在 Survivor 空间中相同年龄所有
对象⼤⼩的总和⼤鱼 Survivor 空间的⼀半(默认50%),年龄⼤于或等于该年龄的对象就可以直接进⼊⽼年代。⽆需在乎
XX:MaxTenuringThreshold参数。因此,MaxTenuringThreshold 只是对象晋升的最⼤年龄。如果将 TargetSurvivorRatio 设置的很⼩,对象将晋升的很快。
6. -XX:PretenureSizeThresholds={value} 除了年龄外,对象的体积也是影响晋升的⼀个关键,也就是⼤对象。如果⼀个对象新⽣代放不
下,只能直接通过分配担保机制进⼊⽼年代。该参数是设置对象直接晋升到⽼年代的阈值,单位是字节。只要对象的⼤⼩⼤于此阈值,就会直接绕过新⽣代,直接进⼊⽼年代。注意:这个参数只对 Serial 和 ParNew 有效,ParallelGC ⽆效,默认情况下该值为0,也就是不指定最⼤的晋升⼤⼩,⼀切有运⾏情况决定。
7. -XX:-UTLAB 禁⽤线程本地分配缓存。TLAB 的全称是 Thread LocalAllocation Buffer ,即线程本地线程分配缓存,是⼀个线程私有
的内存区域。该设计是为了加速对象分配速度。由于对象⼀般都是分配在堆上,⽽对是线程共享的。因此肯定有锁,虽然使⽤ CAS 的操作,但性能仍有优化空间。通过为每⼀个线程分配⼀个 TLAB 的空间(在 eden 区),可以消除多个线程同步的开销。默认开启。
8. -XX:TLABSize 指定 TLAB 的⼤⼩。
9. -XX:+PrintTLAB 跟踪 TLAB 的使⽤情况。⽤以确定是⽤多⼤的 TLABSize。
10. -XX:+ResizeTLAB ⾃动调整 TLAB ⼤⼩。
同时,对象也可能会在栈上分配,栈上分配,TLAB 分配,堆分配,他们的流程如下:
还有⼀些开启 GC ⽇志的参数,是 GC 调优不可或缺的⼯具。
11. -XX:+PrintGCDateStamps 打印 GC ⽇志时间戳。
12. -XX:+PrintGCDetails 打印 GC 详情。
离婚协议书通用版
13. -XX:+PrintGCTimeStamps: 打印此次垃圾回收距离jvm开始运⾏的所耗时间。
14. -Xloggc: 将垃圾回收信息输出到指定⽂件
15. -verbo:gc 打印 GC ⽇志
16. -XX:+PrintGCApplicationStopedTime 查看 gc 造成的应⽤暂停时间
17. XX:+PrintTenuringDistribution, 对象晋升的⽇志
18. -XX:+HeapDumpOnOutOfMemoryError 内存溢出时输出 dump ⽂件。
# 总结
好了,我们已经将⼀些常⽤的 GC 参数介绍了,当然会有遗漏的,如有遗漏或者介绍有误的,请告知本⼈。这些参数不仅仅是为了服务⼤家,同时也是⾃⼰做的⼀个总结,以后就不⽤到处找了。说⽩了这就是写博客的好处:总结了⾃⼰,也做了备份,同时也可能帮助了别⼈。
Good Luck

本文发布于:2023-06-04 11:01:03,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/984708.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:参数   时间   收集器   对象
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图