java面试中常问的垃圾收集器CMS和G1是什么?
面试中经常被问到CMS和G1垃圾收集器,故来总结下!
CMS收集器:concurrent mark and sweep,并发标记和清除,追求最少的时间停留的收集器!
CMS执行收集步骤:
1,初始标记:快速标记GC roots能直接关联到的对象,速度快;需要STW(stop the world)
2,并发标记:进行GC Roots Tracing;(时间长,但是可以和用户线程并行执行)
3,重新标记:标记并发标记期间,用户程序继续运行而导致的标记变化(stop the world)
4,并发清除:并行执行垃圾清除,这一步也会产生浮动垃圾;(时间长,但是可以和用户线程并行执行)
优点:并发执行效率好,停顿时间短;
缺点:
1,并发清除的时候产生浮动垃圾;
2,标记-清除算法,产生大量的内存碎片,很容易引发full gc;
3,默认启用的处理线程数为(CPU的个数+3)/4,即至少使用25%的CPU,多的话会是100%;
CMS主要针对老年代的垃圾收集,通常和ParNewGC(新生代收集)一起使用;
G1:将整个堆内存分为大小相等的多个独立region区,保留新生代,老年代概念,却没有做物理隔离,G1记录每个region中的对象活性,根据用户设置的停顿时间,选择活性更低的region进行回收,这样能降低停顿时间;
G1新生代收集:新生代达到比例的时候进行收集,根据统计信息动态调整Eden和Survivor的大小,合理利用内存;
G1老年代收集:
1,初始标记:跟CMS类似
2,并发标记:跟CMS类似
3,最终标记:跟CMS类似
4,筛选回收:对所有region中的回收成本进行排序,同时根据用户设定的停顿时间来指定回收计划,并发清除对象(stop the world)
G1优点:
1,停顿时间可预测:根据用户设定的停顿时间进行stop the world和gc;
2,region的回收具有优先级:对象收集更有效率和针对性;
3,标记-整理算法:不再有内存碎片产生;
下个帖子将会详细讲一下jvm中的相关内容,需要的朋友一定要关注哦。。