文章目录
1 简介
G1开创了收集器面向局部收集的设计思路和基于Region的内存布局形式,它被作为JDK9的默认收集器,以接替JDK5提供的CMS收集器,所以同样是一款主要面向服务器应用的垃圾收集器。
它的设计目标不再是一次性把整个堆空间清理干净,而是追求内存分配速率与内存回收速率的平衡,以到达在GC产生的延迟可控的情况下,获得尽可能高的吞吐量。
2 停顿时间模型
“停顿时间模型”是G1最主要的特性,它允许程序员可以按照应用程序对延迟时间的可忍受程度,自由的将GC的执行时间限制在一个固定的范围内,使得应用程序的响应时间与吞吐量达到一个合理的平衡。
为了实现这一目标,G1从内存布局空间、对象分配策略、回收策略等多个方面进行了重新设计。
3 Region
基于Region的堆内存布局设计是G1能够建立其可预测的停顿时间模型的关键。
G1采用“化整为零”的解题思路,它将连续的Java堆内存空间划分为多个大小相等的独立区域,每一块称为一个Region(通过-XX: G1HepRegionSize可自定义每个Region的大小,取值范围为1M~32M)。
每个Region都可以根据需要,充当新生代的Eden、Survivor或老年代空间。所以新生代和老年代的大小不再固定,而是动态变化的。
对于大对象的堆内存分配,G1通过一类称为Humongous的特殊区域,专门用于存储大对象的Region。当对象的大小超过一个Region容量大小的一半,即判定为大对象。而对于超过整个Region容量大小的超级大对象,将被存放在N个连续的Humongous Region中。