G1垃圾回收器
G1垃圾回收器是基于标记整理算法实现,不会产生内存碎片,G1不同于其他的收集器,G1的回收范围是整个Java堆,而其他收集器仅限于新生代和老年代。
与此同时为适应不断扩大的内存和不断增加,降低暂停时间,提高吞吐量。
官方的目标设定在延迟可控的情况下获得尽可能高的吞吐量。
G1是一个并行的回收器,他将堆内存分割为许多不相关的区域,使用不同的Region来表示Eden,survivor,old。
G1 GC有计划的避免在整个java 堆中进行全区域的垃圾收集.
G1通过跟踪各个region里面垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,有限 回收价值最大的Region.
优点:
(1)并发于并行
并行性:G1在垃圾回收期间,可以多个GC线程同时工作,有效利用多核计算能力,此时用户线程STW;
并发性;G1拥有于与用户线程交替执行的能力,部分工作可以和应用程序同时执行。不会在整个回收阶段发生完成阻塞
(2)G1依然属于分代垃圾回收器,他会区分年轻代和老年代。
(3)可预测的停顿时间模型
G1会通过一个合理的计算模型,计算出每个Region的收集成本,这样以来,收集器在给定了停顿时间限制的情况下。总能选择一组合适的regions作为收集目标
缺点:
G1在垃圾收集过程中产生内存占用和负载较高。
垃圾收集过程:
(1)初始标记:标记初GC root直接关联的对象,停止用户线程
(2)并发标记:对GC root 进行可达性分析,找出存活对象,
(3)重新标记:修正并发标记阶段由于用户程序执行而产生变动的记录
(4)筛选回收:对各个region的回收价值和成本排序,根据用户所期望的GC停顿时间来指定回收计划,用户线程停顿。
适用场景:大内存的场景
https://blog.csdn.net/weixin_45839894/article/details/120433487