杭州网站免费制作,安康市燃气公司电话,宁波seo网络推广优质团队,潍坊网站建设优化推广前言
本文参考《深入理解Java虚拟机》#xff0c;本文主要介绍G1收集器的收集思想和具体过程#xff08;填上一篇文章留下的坑#xff09;
本系列其他文章链接#xff1a; JVM#xff08;Java Virtual Machine#xff09;内存模型篇 JVM#xff08;Java Virtual Machi…前言
本文参考《深入理解Java虚拟机》本文主要介绍G1收集器的收集思想和具体过程填上一篇文章留下的坑
本系列其他文章链接 JVMJava Virtual Machine内存模型篇 JVMJava Virtual Machine垃圾收集算法篇 JVMJava Virtual Machine垃圾收集器篇
G1Garbage First收集器
G1是一款主要面向服务端应用的垃圾收集器。它诞生的目的就是取代CMS的位置或者说是“代替者”和“继承人”。开发者在设计之初就是希望能建立一个“停顿时间模型”的收集器。 停顿时间模型能够支持指定在一个长度为x毫秒的时间片段内消耗的垃圾收集时间大概率不超过x毫秒这样的目标 所以G1就在这样的希望下被创造出来了
G1的“化整为零”
在G1收集器中它将连续的堆划分为大小相等的独立的区域Region每个Region都可以根据需要扮演新生代的Eden、Survivor空间或者老年代空间这些空间大小都是动态变化的不再和以前的收集器一样限定分区空间大小。
除此之外Region还有一类Humongous区域这部分区域是专门为大对象准备的。 大对象判定每个对象超过Region容量一半以上就算大对象 所以基于以上分区下G1的垃圾收集就没有Minor GC、Major GC、Full GC 这种概念了它采用的是Mixed GC也就是说G1可以对堆中的任何部分来组成回收集合Collection Set通俗就是“打包一起丢”它的衡量标准是哪块内存中存放的垃圾数量最多回收价值越大就在规定的时间内优先处理这些垃圾
因此为了知道那个区域最优价值所以也需要维护一个优先列表每次GC从列表中取最优的这也是为什么叫“Garbage First”的原因。
基于以上G1中堆的内存布局可能是这样的
G1存在的关键问题已经如何解决的
问Region里面存在跨Region引用对象如何解决 答 使用记忆集但这个记忆集会比其他垃圾器的记忆集更为复杂G1 至少要花费相当于Java堆容量的10%~20%来对这个记忆集进行维护工作。 每个Region的记忆集不就记录下当前Region指向的其他Region的地址而且还有别人指向自己的并标记这些指针分别在哪些卡页范围之内也就是 “我指向谁谁指向我”的记忆集。 补充内容记忆集可以避免垃圾扫描时进行全堆扫描节约时间 问并发标记阶段如何保证收集线程与用户线程互不干扰地运行 答 在回答这个问题前我们需要了解两个概念“增量更新”和“原始快照” 增量更新在并发标记过程中用户线程新对象在GC Root上的某个Node相关联时我们将这个新来的引用记录下来并发标记结束后重新对Node进行扫描查看是否任然是关联关系。原始快照SATB算法对当前堆的关联关系进行快照保存不管中途是新增还是删除并发标记过程中根据快照的关联关系进行扫描 在了解上面两个概念后就可以回答这个问题了G1使用的是原始快照当然具体实现上肯定不止这么简单 此外G1为每个Region设计了两个名为TAMSTop at Mark Start的指针把Region中的一部分空间划分出来用于并发回收过程中的新对象分配并发回收时新分配的对象地址都必须要在这两个指针位置上。G1收集器默认这个地址上的对象是被隐式标记过了即默认他们是存活的。 问怎样建立起可靠的停顿预测模型 答 G1 收集器的停顿预测模型是以“衰减均值”为理论基础来实现的在垃圾收集过程G1收集器会记录每个Region的一些数据例如记忆集里面的脏数据、回收耗时等数据进行计算最终根据这个值来确认回收价值在规定时间内每次回收价值最大的。详细过程读者可以自行了解这里不做过多赘述OWO G1的垃圾收集过程
G1的垃圾收集大致分为下面四个步骤
初始标记Initial Marking 需要停顿线程但是耗时非常短。仅标记GC Roots能直接关联到的对象比修改TAMS的值让下一阶段用户线程并发能正确在Region中分配对象 并发标记Concurrent Marking 与用户线程并发从GC Roots中递归查找可以回收的对象耗时较长对象数量决定 扫描结束后还需要重新处理SATB记录下的并发时有引用变动的对象 最终标记Final Marking 用户线程短暂停顿用于处理并发阶段结束后遗留下来的最后那少量的SATB记录 筛选回收Live Data Counting and Evacuation: 暂停用户线程并发回收对Region中的价值进行排序然后打包多块Region收集把存活的Region复制到另一个Region中然后情况当前Region。这个过程设计对象移动所以需要暂停用户线程。堆内回收示意
到这一步其实也能看出来G1在一定程度上不仅仅为了低延迟还想方设法保证吞吐量不然再最后回收阶段他任然可以并发用户线程ZGC是如此下图是G1收集器运行过程图 END 希望能对你有帮助