JVM之G1垃圾收集器

以前收集器的特点

年轻代和老年代是各自独立且连续的内存块
年轻代收集器使用 eden + S0 + S1 进行复制算法
老年代收集必须扫描整个老年代区域
都是以尽可能的少而快速地执行 GC 为设计原则

G1 是什么

G1 是一种面向服务端的垃圾收集器,应用在多核处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集器的暂停时间要求。特性:
像CMS收集器一样,能与应用程序并发执行。
整理空闲空间更快。
需要更多的时间来预测 GC 停顿时间。
不希望牺牲大量的吞吐性能。
不需要更大的 JAVA Heap。

G1 收集器的设计目的是取代 CMS 收集器,与 CMS 相比:
G1 垃圾收集器是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。
G1 的 Stop The World 更可控,G1 在停顿上添加了预测机制,用户可以指定期望的停顿时间。

G1 是在 2012 年才在 jdk.1.7u4 中可用,在 jdk9 中将 G1 变成默认垃圾收集器来代替 CMS。它是以款面向服务应用的收集器。
主要改变是 Eden、Survivor 和 Tenured 等内存区域不再是连续的,而是变成了一个个大小一样的 region,每个 region 从 1M 到 32M 不等,一个 region 有可能属于 Eden、Survivor 或者 Tenured 内存区域。

特点
G1 能充分利用多 CPU、多核环境硬件优势,尽量缩短 STW。
G1 整体采用标记-整理算法,局部是通过是通过复制算法,不会产生内存碎片
宏观上看 G1 之中不在区分年轻代和老年代,被内存划分为多个独立的子区域Region。
G1 收集器里面讲整个的内存区域混合在一起,但其本身依然在小范围内要进行年轻代和老年代的区分。保留了新生代和老年代,不在是物理隔离,而是一部分 Region 的集合且不需要 Region 是连续的,也就是说依然会采用不同的 GC 方式来处理不同的区域。
G1 虽然也是分代收集器,但整个内存分区不存在物理上的年轻代和老年代的区别,也不需要完全独立的 Survivor to space 堆做复制准备。G1 只有逻辑上的分代概念,或者说每个分区都可能随 G1 的运行在不同代之间前后切换。

底层原理

Region
区域化垃圾收集器:最大好处是化整为零,避免全内存GC操作,只需要按照区域来进行扫描即可。
核心思想是将整个堆内存区域分成大小相同的子区域Region,在JVM启动时会自动设置这些子区域的大小。在堆的使用上,G1并不要求对象的存储一定是物理上连续的,只要是逻辑上连续即可,每个分区不会杜工为某个代服务。
参数-XX:G1HeapRegionSize=n可指定分区大小(1-32mb,2的幂)默认2048个分区,也即最大支持32mb*2048=64G

Region
在这里插入图片描述
新生代垃圾收集器依然采用暂停所有应用线程的方式,将存货对象拷贝到老年代或者survivor空间
老年代 ,G1收集器通过将一些对象从一个区域复制到另外一个区域,完成了清理工作,这意味着,正常处理过程中,G1完成了堆的压缩,这样** 不会存在内存碎片问题**
H表示Humongous。从字面上就可以理解表示大的对象(下面简称H对象)。当分配的对象大于等于Region大小的一半的时候就会被认为是巨型对象。H对象默认分配在老年代,可以防止GC的时候大对象的内存拷贝。通过如果发现堆内存容不下H对象的时候,会触发一次GC操作。

回收步骤
初始标记:只标记GCRoots能直接关联到的对象
并发标记:进行GC Roots Tracing的过程
最终标记:修正并发标记期间,因程序运行导致标记发生变化的那一部分对象
筛选回收:根据时间来进行价值最大化的回收

四步过程
在这里插入图片描述

G1和CMS比较优势

1 G1没有内存碎片
标记清除
2 G1可以精确控制停顿。将新生代,老年代划分为多个固定大小的区域。根据停顿时间收集。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值