Serial、Parallel、ParNew&CMS垃圾收集器之间的比较
2021-09-09 15:22:08 0 举报
常用垃圾收集器比较
作者其他创作
大纲/内容
为什么Parallel垃圾回收时间短呢?因为新生代和老生代GC时,会暂停所有的用户线程,并发执行多个GC线程,STW时间因此会更长,用户体验不好
CPU执行用户线程时间
其他线程消耗CPU时间
高吞吐量=
GC垃圾回收时间长老年代STW时间短,响应时间短用户体验好
GC垃圾回收时间短老年代STW时间长用户体验不好
Parallel垃圾收集器
CMS垃圾收集器
STW时间
GC垃圾回收时间
用户体验=
为什么CMS垃圾回收时间长呢?新生代STW时间和Parallel垃圾处理器新生代STW时间类似,主要是因为老生代FullGC时,会经历初始标记--并发标记--重新标记--并发整理过程,标记存活对象的时间80%都在标记阶段,这段期间用户线程也会执行,执行用户线程的过程中也会产生新的存活对象,相当于边标记存活对象,边产生存活对象老生代STW时间为什么短?一:初始标记时,会暂停所有其他线程,只标记gc roots直接能引用的对象,并不会标记gc roots直接引用对应的间接引用对象,相当于只标记根引用对象,不会标记那些相互引用的对象,所以说速度很快,STW时间很短,用户几乎感知不到二:并发标记时,GC线程和用户线程基本上同时在运行,并发标记主要标记那些和gc roots直接引用对象相互引用的对象,标记整个对象图的过程,这个标记过程时间很长,但是不需要暂停用户线程,不涉及STW,由于用户线程也在运行,那些之前标记的对象状态可能会发生变化三:重新标记时(三色标记中的增量更新标记算法重新标记并发标记中产生的错标问题),主要是对并发标记时用户线程运行时状态发生变化的对象进行重新标记,这段期间也会有短暂的STW时刻,比初始标记时间略长,但是远小于并发标记时时间四:并发清理,用户线程和GC线程同时存在,主要是对没有标记的区域进行清除,如果这段期间用户线程产生了新的存活对象,则标记为黑色不处理并发标记时,垃圾回收线程和用户线程同时工作,堆空间会边产生对象,边回收垃圾对象,会产生这样的问题,一开始某个对象已经被标记为垃圾对象了,但在后面运行的过程中,很有可能该对象不是垃圾对象了,又有新的引用指向该对象,直接导致错标问题缺点:一:对CPU资源敏感(会和服务抢资源,多个GC线程运行);二:无法处理浮动垃圾(在并发标记和并发清理阶段又产生垃圾,这种浮动垃圾只能等到下一次gc再清理了,导致漏标问题(一开始不是垃圾对象,后来又是垃圾对象)),并发标记时,垃圾回收线程和用户线程同时工作,堆空间会边产生对象,边回收垃圾对象,会产生这样的问题,一开始某个对象已经被标记为垃圾对象了,但在后面运行的过程中,很有可能该对象不是垃圾对象了,又有新的引用指向该对象,直接导致错标问题(一开始是垃圾对象,后来不是垃圾对象),处理方案:重新标记阶段将错标的部分修正错标的对象,采用三色标记中的增量更新算法 三:它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生,当然通过参数XX:+UseCMSCompactAtFullCollection可以让jvm在执行完标记清除后再做整理四:执行过程中的不确定性,会存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况,特别是在并发标记和并发清理阶段会出现,一边回收,系统一边运行,也许没回收完就再次触发full gc,也就是\"concurrentmode failure\
0 条评论
下一页