G1收集器详解「建议收藏」

G1收集器详解「建议收藏」CMS垃圾收集器的弊端:会产生内存碎片&&需要预留空间。这两个问题在处理时,很有可能会导致停顿时间过长,即CMS的停顿时间不可预知。所以G1又可以理解为在CMS垃圾收集器上进行了”升级”。G1垃圾收集器可以给你设定一个你希望Stoptheworld停顿时间,G1会根据这个时间尽量满足你。在JVM堆中,堆的内存分布是以物理空间进行隔离——但是在G1垃圾收集器中,堆的划分不再是物理形式,而是以逻辑的形式进行划分。但是,分代的概念在G1中依旧奏效,比如,新对象一般会被分配.

大家好,又见面了,我是你们的朋友全栈君。

CMS垃圾收集器的弊端:会产生内存碎片 && 需要预留空间。
这两个问题在处理时,很有可能会导致停顿时间过长,即CMS的停顿时间不可预知。
所以G1又可以理解为在CMS垃圾收集器上进行了”升级”。

G1垃圾收集器可以给你设定一个你希望Stop the world停顿时间,G1会根据这个时间尽量满足你。

在JVM堆中,堆的内存分布是以物理空间进行隔离——
在这里插入图片描述
但是在G1垃圾收集器中,堆的划分不再是物理形式,而是以逻辑的形式进行划分。

但是,分代的概念在G1中依旧奏效,比如,新对象一般会被分配到Eden区,经过15次Minor GC新生代的对象如果还存活,会移交到老年代等等…

以下为G1中【堆】的空间分布——
在这里插入图片描述
从图中可以发现,堆被划分了多个同等份的区域,在G1中每个区域叫Region。

在以前的垃圾收集器都是对堆进行物理划分,如果堆空间(内存)大的时候,每次进行【垃圾回收】都需要堆一整块大的区域进行回收,那收集的时间不好控制,而划分了多个小区域后,对【小区域】的回收就容易控制它的【收集时间】

在G1中,还有一种Humongous(大对象)区域,其实就是来存储特别大的对象(大于region内存的一半).一旦发现没有引用指向大对象,就可直接在年轻代的Minor GC中被回收。

G1的GC过程

在G1收集器中,可以主要分为有Minor GC(young GC)和Mixed GC,也有写特殊场景会发生full GC

Minor GC

G1的Minor GC触发时机与其他的垃圾收集器一样:

等Eden区满了之后,会触发Minor GC。Minor GC同样也是会发生Stop the world.

值得注意的是,在G1的世界里,新生代和老年代所占堆的空间是没那么固定的,会根据【最大停顿时间】进行调整。

这块要知道会给我们提供参数进行配置即可。根据参数动态地改变年轻代Region的个数可以控制Minor GC的开销

Minnor GC的回收过程:

  • 根扫描
  • 更新 && 处理Rset
  • 复制对象
根扫描
 与之前的CMS类似,可以理解为初始标记的过程
更新 && 处理Rset

Rset概念: 在CMS中Minor GC是通过【卡表】来避免全表扫描老年代的对象。因为Minor GC是回收年轻代的对象,但如果老年代有对象引用着年轻代,那这些被老年代引用的对象就不能被回收。

同样的,在G1中也存在这种问题。在CMS中叫卡表,G1解决【跨代引用】的问题的存储一般称为RSet

RSet存储在每个Region中,它记录着其他Region引用了当前Region的对象关系。
在这里插入图片描述

对于年轻代的Region,它的RSet只保存了来自老年代的引用,因为年轻代自己都要做Minor GC了。
对于老年代的Region,它的RSet只会保存老年代对它的引用,因为在G1收集器,老年代回收之前,都会先对年轻代进行回收,所以没必要保存年轻代的引用。

所以第二步就是:处理RSet的信息并且扫描,将老年代对象持有年轻代对象的相关引用到加入到GC Roots下,避免被回收。

复制对象

把扫描之后存活的对象往【空的Survivor区】或者【老年代】存放,其他的Eden区进行清除。

另外,在G1中还有另一个名字:CSet,Collection
Set,保存了一次GC中【将执行垃圾回收】的Region。CSet中的所有存活对象都会被转移到别的可用Region上
在这里插入图片描述

总结:扫描、处理跨Region引用,收集至CSet,复制清除、处理引用。

Mixed GC

当堆空间的占用率达到一定阈值后会触发Mixed GC(默认45%,由参数决定)。Mixed GC会依赖全局并发标记统计后的Region数据

全局并发标记:

  • 初始标记(STW)
  • 并发标记
  • 最终标记(STW)
  • 清理(STW)

从名字可以知道,Mixed GC是一个混合GC,Mixed GC一定会回收年轻代,并会采集部分老年代的Region进行回收。

初始标记

这个过程共用了Minor GC的Stop the world,复用了扫描GC Roots的操作。
在这个过程中,老年代和新生代都会被扫描

并发标记

这个阶段不会stop the world,GC线程与用户线程一起执行,GC线程负责收集各个Region的存活对象信息。从GC Roots往下追溯,查找这个堆存活的对象,比较耗时。

重新标记

与CMS一样,标记那些在并发标记阶段发生变化的对象。

清理

这个阶段也会stop the world,主要清点和重置标记状态,会根据停顿预测模型来决定本次GC多少Region.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134583.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决BASE64Encoder报错的问题

    解决BASE64Encoder报错的问题今天在用servlet写一个文件下载的案例时,想解决文件的中文显示问题。然后在导包importsun.misc.BASE64Encoder时,发现IDEA报错了,无法识别这个类。最后发现在JDK9后,官方就已经不支持importsun.misc.BASE64Encoder了。网上说了很多,第一种是把JDK的版本降低到1.8以内。但是我觉得这不是解决的最好办法。我觉得应该去修改原有的代码。所以我采用了官方提供了新的jar包importjava.util.Base64。下面这个java类的本意

    2022年6月15日
    47
  • linux内存不足导致tomcat宕机

    linux内存不足导致tomcat宕机情况,正常运行的服务器,突然tomcat不能访问了因为服务器的内存是2g的,所以就怀疑是内存不够了,所导致开始排查ps-ef|greptomcat[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TTLyQ5EC-1585835537446)(E:\Workspaces\Markdown\linux\记一次内存不够的情况.assets\image-…

    2022年7月23日
    6
  • 5G核心网UPF是什么_3gpp 5g协议

    5G核心网UPF是什么_3gpp 5g协议目录文章目录目录UPF参考文档UPFUPF(…

    2022年8月3日
    6
  • 二叉树 二叉搜索树_二叉树和二叉搜索树

    二叉树 二叉搜索树_二叉树和二叉搜索树原题链接一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。输入格式:输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。输出格式:如果输入序列是对一棵二叉搜索树或

    2022年8月8日
    5
  • stm32串口工作原理_rs232串口通信原理

    stm32串口工作原理_rs232串口通信原理STM32F1xx官方资料:《STM32中文参考手册V10》-第25章通用同步异步收发器(USART)通信接口背景知识设备之间通信的方式一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是:并、串行通信的区别 并行通信 串行通信 传输原理 数据各个位同时传输 数据按位顺序传输 优点 速度快 占用引脚资…

    2022年9月6日
    2
  • matlab绘制二元函数图像z=1/(1-x^2)+y^2_python画二元二次函数图像

    matlab绘制二元函数图像z=1/(1-x^2)+y^2_python画二元二次函数图像MATLAB内置有强大的绘图功能,以下将以几个实例进行说明。绘制三维参数曲线t=-5:0.1:5;%设定参数范围theta=0:0.02*pi:2*pi;%注意如果有两个参数的话,它们的维数必须统一x=sqrt(1+t.^2).*cos(theta);%注意乘方和乘法的写法y=sqrt(1+t.^2).*sin(theta);z=2*t;%设定参数方程plot3(x,y,z,’-g’);%绘图,最后一个选项为颜色,绿色title(‘参数曲线’);%添加标题效果:可以拖动图片从不同

    2022年9月7日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号