《深入理解JAVA虚拟机 3》
Garbage First收集器
开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。JDK9开始,G1宣告取代Parallel Scavenge加 Parallel Old组合,成为服务端模式下的默认垃圾收集器。
设计思路:
G1的目标是建立一个”停顿时间模型(Pause Prediction Model)的收集器“,也就是支持指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间大概率不超过N毫秒
。
和之前的垃圾收集器的区别:
-
之前的收集器,垃圾收集目标是新生代(Minor GC)或者老年代(Major GC)或者整个Java堆(Full GC),G1则是面向堆内任何部分来组成回收集(Collection Set CSet)进行回收,衡量标准不在是它属于哪个分代,而是哪块内存存放的垃圾数量最多,回收的受益最大,整个就是G1收集器的
Mixed GC
模式。
-
G1仍然遵循分代收集的理念设计,但是其堆内存布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间或者老年代空间,收集器堆堆扮演不同角色的Region采用不同的策略去处理。
Region
Region中有一类特殊的Humongous(极大的)区域
,专门用来存储大对象。G1认为超过了Region容量一半的对象就是大对象。G1的大多数行为都把humongous作为老年代的一部分来进行看待。
Region作为单元回收的最小单位,每次来及回收都是Region空间的整数倍。
具体回收思路:
G1收集器去跟踪各个Region里面的垃圾堆积的”价值“大小
,价值回收所获得的的空间大小以及回收所需时间的经验值,然后后台维护一个优先级列表
,每次根据用户设定的手机停顿时间优先处理回收价值受益最大的那些Region,这也是”Garbage First“名字的由来。
文献参考:
《深入理解Java虚拟机》 第三版
图片引用:
https://www.infoq.com/articles/G1-One-Garbage-Collector-To-Rule-Them-All/