【0303】 学32Java 面试必考点 分代回收

一、为是么需要分代管理

1、分代管理主要是为了方便垃圾回收。

2、大部分对象很快就不再使用;

3、一部分不会立即无用,但也不会持续很长时间。

二、分代划分

虚拟机划分为年轻代、老年代、和永久代

在这里插入图片描述

1、年轻代 (存放新创建的对象)

A) 年轻代分为 Eden 区和两个 Survivor 区。

B) 大部分对象在 Eden 区中生成。当 Eden 区满时,还存活的对象会在两个 Survivor 区交替保存,

C) 达到一定次数的对象会晋升到老年代(15次)。

2、老年代(存放从年轻代晋升而来的,存活时间较长的对象)

3、永久代

主要保存类信息等内容,上图的永久代是指对象划分方式,不是专指 1.7 的 PermGen,或者 1.8 之后的 Metaspace。

三、JVM 垃圾回收算法

根据年轻代与老年代的特点,JVM 提供了不同的垃圾回收算法。垃圾回收算法按类型可以分为引用计数法、复制法和标记清除法。

1、引用计数法

通过对象被引用的次数来确定对象是否被使用,缺点是无法解决循环引用的问题。

2、复制算法

需要 from 和 to 两块相同大小的内存空间,对象分配时只在 from 块中进行,回收时把存活对象复制到 to 块中,并清空 from 块,然后交换两块的分工,即把 from 块作为 to 块,把 to 块作为 from 块。缺点是内存使用率较低。

3、标记清除算法

分为标记对象和清除不在使用的对象两个阶段,标记清除算法的缺点是会产生内存碎片。

4、JVM 中提供的年轻代回收算法 Serial、ParNew、Parallel Scavenge 都是复制算法, CMS、G1、ZGC 都属于标记清除算法。

四、CMS 算法

CMS 在 JDK1.7 之前可以说是最主流的垃圾回收算法。CMS 使用标记清除算法,优点是并发收集,停顿小

在这里插入图片描述

1、初始标记阶段:会 stop the world,标记的对象只是从 root 集最直接可达的对象;

2、并发标记阶段:GC 线程和应用线程并发执行。主要是标记可达的对象;

3、重新标记阶段,这个阶段是第二个 stop the world 的阶段,停顿时间比并发标记要小很多,但比初始标记稍长,主要对对象进行重新扫描并标记;

4、并发清理阶段:进行并发的垃圾清理;

5、并发重置阶段:为下一次 GC 重置相关数据结构。

五、G1 算法

A) G1 在 1.9 版本后成为 JVM 的默认垃圾回收算法,G1 的特点是保持高回收率的同时,减少停顿。

B) G1 算法取消了堆中年轻代与老年代的物理划分,但它仍然属于分代收集器。G1 算法将堆划分为若干个区域,称作 Region。一部分区域用作年轻代,一部分用作老年代,另外还有一种专门用来存储巨型对象的分区。

在这里插入图片描述

C) G1 也和 CMS 一样会遍历全部的对象,标记对象引用情况,在清除对象后会对区域进行复制移动整合碎片空间。

回收过程

1、G1 的年轻代回收,采用复制算法,并行进行收集,收集过程会 STW。

2、G1 的老年代回收时也同时会对年轻代进行回收(主要分为四个阶段)

A) 依然是初始标记阶段完成对根对象的标记,这个过程是STW的;

B) 并发标记阶段,这个阶段是和用户线程并行执行的;

C) 最终标记阶段,完成三色标记周期;

D) 复制/清除阶段,这个阶段会优先对可回收空间较大的 Region 进行回收,即 garbage first,顾称 G1 。

六、ZGC 特点

ZGC 是最新的 JDK1.11 版本中提供的高效垃圾回收算法,ZGC 针对大堆内存设计可以支持 TB 级别的堆,ZGC 非常高效,能够做到 10ms 以下的回收停顿时间。

ZGC 特点

1、ZGC 使用着色指针技术:64 位平台上,一个指针的可用位是 64 位,ZGC 限制最大支持 4TB 的堆,这样寻址只需要使用 42 位,那么剩下 22 位就可以用来保存额外的信息,着色指针技术就是利用指针的额外信息位,在指针上对对象做着色标记。

2、使用读屏障,ZGC 使用读屏障来解决 GC 线程和应用线程可能并发修改对象状态的问题,而不是简单粗暴的通过 STW 来进行全局的锁定。使用读屏障只会在单个对象的处理上有概率被减速。

3、由于读屏障的作用,进行垃圾回收的大部分时候都是不需要 STW 的,因此 ZGC 的大部分时间都是并发处理。

4、基于 Region,这与 G1 算法一样,不过虽然也分了 Region,但是并没有进行分代。ZGC 的 Region 不像 G1 那样是固定大小,而是动态地决定 Region 的大小,Region 可以动态创建和销毁。这样可以更好的对大对象进行分配管理。

5、压缩整理。CMS 算法清理对象时原地回收,会存在内存碎片问题。ZGC 和 G1 一样,也会在回收后对 Region 中的对象进行移动合并,解决了碎片问题。

ZGC 回收过程

在这里插入图片描述

1、开始进行回收阶段,ZGC 首先会进行一个短暂的 STW,来进行 roots 标记。这个步骤非常短,因为 roots 的总数通常比较小。

2、开始进行并发标记阶段,通过对对象指针进行着色来进行标记,结合读屏障解决单个对象的并发问题。这个阶段在最后还是会有一个非常短的 STW 停顿,用来处理一些边缘情况,这个阶段绝大部分时间是并发进行的,所以没有明显标出这个停顿。

3、清理阶段,把标记为不在使用的对象进行回收,把不在使用的对象进行了回收。

4、重定位阶段:对 GC 后存活的对象进行移动,来释放大块的内存空间,解决碎片问题。

A) 重定位最开始会有一个短暂的 STW,用来重定位集合中的 root 对象。暂停时间取决于 root 的数量、重定位集与对象的总活动集的比率。

B) 最后是并发重定位,这个过程也是通过读屏障,与应用线程并发进行的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值