G1简介
Jdk7正式引入G1,jdk9及以后默认的垃圾回收器。下图是简单的G1示意图:
- 如上图所示,G1收集器将整个Java堆默认划分为2048个大小相同的独立region块,每个region的大小控制在1MB-32MB之间,必须是整数,可通过参数设定。虽然任然保留了年轻代和老年代的概念,但是新生代和老年代不再是物理隔离了,特们都是由一部分不连续的region组成。
- 上图有色方块有各自所属的区域,s代表survivor区;白色方块表示还未使用的堆空间,GC时使用复制算法用得上或者新对象进来存储用得上。蓝色的humongous主要用于存储大对象,超过了1.5个region就存储在该区域。
- 当一个H区存不下一个大对象时,G1会寻找连续的H区来存储,为了能够找到连续的H区有时候不得不启动Full GC。
G1的特点
- 是一个并行回收器,将堆分割为多个不相关的区域(region,各个region物理上不连续),使用不同的Regin表示Eden、survivor、老年代等。
- G1的GC有计划的避免整个Java堆进行GC,G1跟踪各个region里的垃圾堆积的价值大小(回收获得的空间大小以及回收所需的时间经验值),在后台维护一个优先列表,每次根据允许收集的时间下,优先回收价值最大的region。所以名为垃圾优先(garbage first)。
- G1主