目录
前言
之前学习了java回收机制知识,包括各种回收算法,以及CMS与G1huishou 机制的对比。这一篇主要总结cms的知识,对cms回收机制的认识更加全面。
CMS
介绍
cms 并发标记清除,有两种收集方式:并发,串行。初衷:为了减少GC的时间,从而提高系统的响应。
特点
需要cpu比较多,碎片化
cpu需求高:并发收集
ParallelRefProcEnabled | 是否开启并发引用处理 |
碎片化:cms在清理的时候没有进行整理、压缩
UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 是搭配使用的;前者目前默认就是true了,也就是关键在后者上。
触发cms并发周期的条件
-
阈值检查机制:老年代的使用空间达到某个阈值,JVM的默认值是92%(jdk1.5之前是68%,jdk1.6之后是92%),或者可以通过CMSInitiatingOccupancyFraction和UseCMSInitiatingOccupancyOnly两个参数来设置;这个参数的设置需要看应用场景,设置得太小,会导致CMS频繁发生,设置得太大,会导致过多的并发模式失败。例如
-
动态检查机制:JVM会根据最近的回收历史,估算下一次老年代被耗尽的时间,快到这个时间的时候就启动一个并发周期。设置UseCMSInitiatingOccupancyOnly这个参数可以将这个特性关闭。4.CMS的并发收集周期会扫描哪些对象?会回收哪些对象?答:CMS的并发周期只会回收老年代的对象,但是在标记老年代的存活对象时,可能有些对象会被年轻代的对象引用,因此需要扫描整个堆的对象。
UseCMSInitiatingOccupancyOnly | 关闭CMS的动态检查机制,只通过预设的阈值来判断是否启动并发收集周期 |
CMSInitiatingOccupancyFraction | 老年代空间占用到多少的时候启动并发收集周期,跟UseCMSInitiatingOccupancyOnly一起使用 |
可以通过开启阈值检查机制进行控制
jvm大小总结
Xmx和Xms大小比例,一般是1:1
因为避免GC后堆大小的调整带来的压力