G1垃圾回收器要点:
1.什么是G1垃圾回收器:
G1是一款专门针对于拥有多核处理器和大内存的机器的收集器,在满足了GC响应时间的延迟可控的情况下,也会尽可能提高的程序的吞吐量
2.G1垃圾回收器的优点:
①与CMS收集器一样,能够与用户线程同时执行,完成并发收集。
②GC过程会有整理内存的过程,不会产生内存碎片,并且整理空闲内存速度更快。
③GC发生时,停顿时间可控,可以让程序更大程度上追求低延迟。
④追求低延迟的同时,尽可能会保证高吞吐量。
3.G1分区的好处:
G1收集器虽然在逻辑上存在分代的概念,但不再是物理隔阂了,也就是指在物理内存上是不分代的,内存空间会被划分为一个个的Region
区,这样做的好处在于:JVM不需要再为堆空间分配连续的内存,堆空间可以是不连续物理内存来组成Region
的集合。
4.G1中的大对象
在G1中,判定一个对象是否为大对象的方式为:对象大小是否超过单个普通Region
区的50%,如果超过则代表当前对象为大对象,那么该对象会被直接放入Humongous
区
Humongous
区存在的意义:可以避免一些"短命"的巨型对象直接进入年老代,节约年老代的内存空间,可以有效避免年老代因空间不足时的GC开销。
5.G1收集器的GC类型(全能收集器):
1.YoungGC
YoungGC
并非说Eden
区放满了就会立马被触发,在G1中,当新生代区域被用完时,G1首先会大概计算一下回收当前的新生代空间需要花费多少时间,如果回收时间远远小于参数-XX:MaxGCPauseMills
设定的值,那么不会触发YoungGC
,而是会继续为新生代增加新的Region
区用于存放新分配的对象实例。直至某次Eden
区空间再次被放满并经过计算后,此次回收的耗时接近-XX:MaxGCPauseMills
参数设定的值,那么才会触发YoungGC
。
G1收集器中的新生代收集,依旧保留了分代收集器的特性,当YoungGC
被触发时,首先会将目标Region
区中的存活对象移动至幸存区空间(被打着Survivor-from
区标志的Region
)。同时达到晋升年龄标准的对象也会被移入至年老代Region
中存储。
值得注意的是:G1收集器在发生YoungGC
时,复制移动对象时是采用的多线程并行复制,以此来换取更优异的GC性能。
用户如若未曾显式通过-XX:MaxGCPauseMills
参数设定GC预期回收停顿时间值,那么G1默认为200ms
2.MixedGC
垃圾收集时会先发生MixedGC
,主要采用复制算法,在GC时先将要回收的Region
区中存活的对象拷贝至别的Region
区内,拷贝过程中,如果发现没有足够多的空闲Region
区承载拷贝对象,此时就会触发一次Full GC
。
3FullGC
G1垃圾回收的过程?
初始标志:先触发STW
,然后使用单条GC线程快速标记GCRoots
直连的对象
并发标志:先触发STW
,然后使用单条GC线程快速标记GCRoots
直连的对象
重新标(停止所有用户线程后,采用多线程并行回收):同CMS的重新标记阶段,主要是为了纠正并发标记阶段因用户操作导致的错标、误标、漏标对象。
筛选回收(停止所有用户线程后,采用多线程并行回收):先对各个Region
区的回收价值和成本进行排序,找出「回收价值最大」的Region
优先回收。
G1收集器正是由于「筛选回收」阶段的存在,所以才得以冠名「垃圾优先收集器」。在该阶段中,对各个Region
区排序后,G1会根据用户指定的期望停顿时间(即-XX:MaxGCPauseMillis
参数设定的值)选择「价值最大且最符合用户预期」的Region
区进行回收
在G1中不管是新生代还是年老代,回收算法都是采用复制算法,在GC发生时都会将一个Region
区中存活的对象复制到另外一个Region
区内。同比之前的CMS收集器采用的标-清算法而言,这种方式不会造成内存碎片,因此也不需要花费额外的成本整理内存。
在为大对象进行内存分配时,不会因为找不到连续的内存空间提前触发下一次GC,有利于程序长期运行,尤其是在大内存情况下的堆空间,带来的优势额外明显。
G1解决三色标记法漏标问题
1.新分配
2.引用更改漏标
G1收集器是开辟分区收集的里程碑,同时它也被称为垃圾优先收集器,因为G1会在后台维护着一个优先列表:CollectionSet(CSet)
,它记录了GC要收集的Region
集合,集合里的Region
可以是任意年代的。
每次GC发生时会根据「用户指定的期望停顿时间或默认的期望停顿时间」,优先从列表中选择「回收价值最大」Region
区回收
CMS收集器要点:
CMS
收集器全称为ConcurrentMarkSweep
,该款回收器是GC机制中的一座里程碑,在该款收集器中首次实现了并发收集的概念,也就是不停止用户线程,GC线程与用户线程一同工作的情况。同时该款收集器追求的是最短的回收时间,属于多线程收集器,其内部采用标记-清除算法。
CMS使用标清算法
过程:初级标记,并发标志,重新标记,并发清除
在整个收集过程中,除开初始标记与重新标记阶段,其他的收集动作都是与用户线程并发执行的。因此,CMS收集器在发生GC时,造成的程序暂停是非常短暂的,对于用户体验感而言,相对比之前的收集器而言是最优者 。也正由于CMS收集器并发收集、停顿延迟低 的特性,所以在有些地方也被称为并发低停顿收集器。
采用三色标记算法的收集器又是如何具体解决漏标问题的呢?
- CMS:增量更新 + 写屏障
- G1:STAB + 写屏障
- ZGC:读屏障