你好呀,我是可乐。
先前,我为大家分享过G1垃圾回收器的前置基础知识,不知道有没有小伙伴还记得呀?不知道的小伙伴可以看我先前的文章哦!
今天的我们来点硬核的吧,总结下有关G1收集器大概的知识点吧,一起来看下吧!
G1为什么要设计出G1收集器?
我们平时在学习一个新技术时,一定要保持着一颗怀疑和好奇的心。这是我们程序员要做到的一点。
这里我说下,jvm团队设计出G1收集器,就是为了取代CMS收集器的,虽然CMS收集器也还不错,但是,在很多场景下还是有诸多问题的,缺陷暴露无遗了。
CMS收集器到底存在哪些缺点呢?
CMS只适合用于老年代收集垃圾,采用了标记-清除算法。标记-清除算法有个大的问题,就是会产生大量的碎片化问题,如果恰好你们业务代码,有一个大对象时,大有可能会频繁触发FullGC。我们都知道频繁FullGC,可能会给应用程序带来卡顿。再者,CMS使用串行老年代收集器单线程清理堆内垃圾的。
在先前收集器中,如果对象大小大于新生代内存空间,则直接晋升为老年代,如果该对象不是频繁使用,那么会非常浪费堆内存空间的。我们能够想到,能否有一款收集器即可以手机新生代垃圾,又可以收集老年代的尼?这个时候,G1收集器就应运而生了,它不是凭空出世的。说白了,G1的设计理念结合了CMS收集器的优缺点,就是来取代CMS收集器的。
G1什么是G1收集器?
首先,我们来看下官方对其定义是怎么样的。
TheGarbageFirstorG1garbagecollectorisavailableinJava7andisdesignedtobethelongtermreplacementfortheCMScollector.TheG1collectorisaparallel,concurrent,andincrementally