67. G1垃圾收集器中的region、G1垃圾收集器的主要回收环节概述
1. Region
的介绍
G1
收集器,默认将Java
堆划分成约2048
个大小相同的独立的Region
块,每一个Region
块大小根据堆空间的时间大小来决定,范围控制在1MB
到32MB
之内。所有的Region
大小相同,且在JVM
生命周期内不会改变(除非JVM
停止之后,重新设置Region
的大小,否则region
的大小不会改变)。Region
使新生代和老年代的物理空间可以是不连续的。- 如下图,堆区被划分成了各个
Region
,各个Region
分别表示Eden
区,Survivor
区,Old
区。一个Region
只能属于一个角色,也就是说一个Region
不能一部分是Eden
区,一部分是Old
区或Survivor
区。 G1
垃圾收集器还新增加了一种内存区域Humongous
区。主要用于存储大对象,如果对象大小超过1.5
个Region
,就放到H
。- 设置
H
区的原因:对于堆中的大对象,默认会被分配到老年代,但是如果它是一个短期存在的对象,由于老年代垃圾收集的频率较低,这个对象是不能及时被回收掉的,会对垃圾收集造成负面的影响。
设置H
区,就能够及时回收。如果一个H
区装不下一个大对象,则寻找连续的H
区来存储,如果找不到连续的H
区,就会启动Full GC
。
2.G1
垃圾收集器的主要回收环节
G1
垃圾收集器收集垃圾的主要环节可以分为3
个阶段(也有可能出现第4
个阶段Full GC
):a)
年轻代GC (Young GC)
b)
老年代并发标记(Concurrent Markong)
c)
混合回收(Mixed GC)
d)
如果Mixed GC
失败,就会触发Full GC
。G1
回收垃圾的步骤如下图所示,首先是年轻代GC
,然后是并发标记过程(并发标记过程可能和年轻代GC
一起发生),最后是混合回收。混合回收失败会触发Full GC
。3
个阶段的简单描述如下: