Java Hotspot G1 GC的一些关键技术


从 Java 9 始,G1 是 32 位和 64 位服务器配置上的默认垃圾收集器。G1是一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求。它是专门针对以下应用场景设计的: 像CMS收集器一样,能与应用程序线程并发执行。整理空闲空间更快。需要GC停顿时间更好预测,不希望牺牲大量的吞吐性能,不需要更大的Java Heap。

G1垃圾回收器

G1 收集器是并行的,并发的,渐进压缩的低暂停垃圾收集器。

在G1的实现过程中,引入了一些新的概念,对于实现高吞吐、没有内存碎片、收集时间可控等功能起到了关键作用。

基础概念

Region

传统的GC收集器将连续的内存空间划分为新生代、老年代和永久代(JDK 8去除了永久代,引入了元空间Metaspace),这种划分的特点是各代的存储地址(逻辑地址,下同)是连续的。如下图所示:

传统GC内存布局

而G1的各代存储地址是不连续的,每一代都使用了n个不连续的大小相同的Region,每个Region占有一块连续的虚拟内存地址。如下图所示:

g1 GC内存布局

在上图中,我们注意到还有一些Region标明了H,它代表Humongous,这表示这些Region存储的是巨大对象(humongous object,H-obj),即大小大于等于region一半的对象。H-obj有如下几个特征: * H-obj直接分配到了old gen,防止了反复拷贝移动。 * H-obj在global concurrent marking阶段的cleanup 和 full GC阶段回收。 * 在分配H-obj之前先检查是否超过 initiating heap occupancy percent和the marking threshold, 如果超过的话,就启动global concurrent marking,为的是提早回收,防止 evacuation failures 和 full GC。

为了减少连续H-objs分配对GC的影响,需要把大对象变为普通的对象,建议增大Region size。

一个Region的大小可以通过参数-XX:G1HeapRegionSize设定,取值范围从1M到32M,且是2的指数。如果不设定,那么G1会根据Heap大小自动决定。相关的设置代码如下:


文章作者: WangQingLei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WangQingLei !
 上一篇
work-summary-remove work-summary-remove
机房迁移过程中,当服务从阿里云迁移到机房网络后,由于网络、网关、运行环境的差异,服务在机房部署后,可能会出现由于跨网访问数据库、其他服务引起的响应时间过大、访问不通问题。为了方便识别此类问题,提供相应的监控,协助迁移研发发现响应状态、响应时
2023-07-27
下一篇 
线程池基础知识 线程池基础知识
线程池基础知识。
2023-07-22
  目录