1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| serial: 年轻代:复制,单线程,stw parnew: 年轻代:复制,多线程,stw parallel scavenge: 年轻代:复制,多线程,stw 吞吐量收集器 -XX:MaxGCPauseMillis最大停顿时间 -XX:GCTimeRatio gc时间占比 比如99 1/1+99 serial old: 老年代:标记整理,单线程,stw parallel old: 老年代:标记整理,多线程,stw cms: 初始标记:stw 并发标记:多线程 重新标记:stw 并发清除:多线程
缺点: 1,cms对处理器资源非常敏感.事实上,面向并发设计的程序都对处理器资源比较敏感 默认回收线程数(核心数+3)/4,也就是说,核心数在4和以上,并发回收时垃圾收集线程只占用不超过25% 核心数在4一下,cms对用户程序的影响就可能比较大. 2,由于有浮动垃圾,有可能出现"Concurrent Mode Failure"失败进而导致领一次完全"Stop The World"的Full GC的产生. 并发标记 (?是否当次) 并发清除 产生的垃圾无法档次进行清除 需要预留一定的空间,-XX:CMSInitiatingOccu-pancyFraction配置触发百分比(jdk5=62,jdk6=92) 3,标记清除,会产生大量碎片,-XXCMSFullGCsBefere-Compaction几次后进行fullgc会进行碎片整理 g1: 将java堆分为多个大小相等的独立区域(region),每个region都会更具需要,扮演新生代的eden,survicor,old空间.收集器更具不同角色的region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间,熬过几次收集到旧对象都获取很好的手机效果. region还有一类特殊的Humongous区域,专门用来存储大对象.超过容量一半的对象即可判断为大对象.-XX:G1HeapRegionSize=1MB---32MB,为2的指数. -XX:MaxGCPauseMillis指定停顿时间. 跨region 过程: 初始标记:stw,耗时很短 仅仅标记gc roots能直接关联的对象,并且修改TAMS指针的值,让下一阶段用户线程并发运行时,能正确在可用的region中分配新对象,耗时很短,而且借用进行minor gc的时候同步完成,所以实际并没有额外的停顿. 并发标记:这个阶段较长 从gc root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这个阶段较长,但可与用户程序并发执行.当对象图扫描完成以后,还要重新处理SATB记录下的并发是有引用变动的对象. 最终标记:stw 用户处理并发阶段结束后仍遗留下来的最后那韶关亮的SATB记录. 筛选回收: 负责更新region的统计数据,对哥哥region的回收价值和成本进行排序,根据用户所期望的停顿时间来指定回收计划,可以自由选择任意多个region构成收集,然后把决定回收的那一部分region的存活对象复制到空的region中,在清理掉整个旧region的全部空间. 回收阶段本来也设计过和用户程序一起并发执行,但是很复杂,考虑只是回收一部分停顿时间段,放到zgc中完成.
|