详解gc(垃圾回收)机制三:GC复制算法

简介: 详解gc(垃圾回收)机制三:GC复制算法

gc算法大致分为以下几种:

1:标记-清除

2:引用计数法

3:GC复制

4:GC标记-压缩

5:保守GC

6:分代垃圾回收

7:增量式垃圾回收

8:RC Immix

在第一篇文章,有讲到  标记-清除,引用计数,以及go的特色 三色标记法.

GC复制算法

GC复制简单来说,就是获取到空间里的活动对象,将所有活动对象复制到其他框架,再把原来空间的所有对象回收掉.

我们把复制活动对象的原空间称为from空间,将粘贴活动对象的新空间称为 to空间

再复制完之后,下一次回收, to空间又变成了from空间,反之from变为了to空间


image.png

GC复制算法步骤:

1:设置指针地址为to空间地址开头

2:找到对象的根(root)

3:根据根进行遍历,同时将活动对象复制到to空间,标记该对象复制成功,记录新活动对象的指针

4:将活动对象的引用子对象遍历,复制到to空间,标记该对象复制成功,记录新活动对象的指针

5:重复3,4动作,直到没有任何可遍历对象

6:将from和to空间互换,整个复制过程完成

优点

1:吞吐量优秀

gc复制算法只搜索并复制活动对象,比一般的标记-清除算法来说,它能够在较短时间完成gc,吞吐量优秀.

2:可实现高数分配

gc复制算法不使用空闲的链表,因为to空间是连续的内存空间,只要to空间不小于from空间大小即可分配

3:不存在内存碎片

因为是直接在连续空间复制变量,不存在内存碎片,而一般的标记-清除算法,在清理非活动对象时,会产生一堆的内存碎片,导致需要通过空闲链表去管理

4:与cpu缓存兼容

在gc复制过程中,由于是 "深度优先遍历" 导致只要和活动对象相关的对象内存地址都在一起,因此mutator执行速度会非常快,cpu高速缓存也是读取位置较近的对象

缺点

1:堆使用效率低下

由于gc复制需要额外使用一个不小于from空间大小的to空间,那就只能让堆空间进行划分一半一半,使其能够支持gc复制,也就意味着进程只能使用一半的内存

2:不兼容保守式GC

保守式GC是啥我也不知道,等后面可以看看,主要是,GC复制需要移动对象重写指针,因为是直接复制到了to空间.

3:需要递归调用函数

在复制对象时,需要递归的复制子对象,每次复制都是需要递归的调用函数,消耗栈,还会出现栈溢出的风险

Cheney的gc复制算法

为了解决递归调用函数的栈问题,C.J.Cheney 研究出了自己的gc复制算法,他的算法不是递归的复制,而是迭代的进行复制

1:设置2个指针地址为to空间地址开头,为free,scan指针

2:找到对象的根(root)

3:根据根进行遍历,同时将根引用的活动对象复制到to空间,同时free指针增加 为 一个对象长度

4:遍历完根之后,移动一个scan指针到to空间的第一个复制对象,并且将对象引用的活动对象复制到to空间,同时free指针增加为一个对象长度

5:to空间第一个复制对象完成之后,scan指针移动到第二个对象,并且将对象引用的活动对象复制到to空间,同时free指针增加为一个对象长度

6:重复4,5步骤,直到scan指针和free指针重合

7:将from和to空间互换,整个复制过程完成

图解:

1:根引用对象为BG,


image.png

2:复制B,G对象,free指针右移,此时根对象遍历完成

image.png

3:开始复制B引用的对象A,复制成功之后B对象完成遍历,scan指针右移到G

image.png

优点

该算法比常规gc复制算法优化了递归操作,抑制了调用函数的额外负担和栈的消耗,从深度优先遍历改为了广度优先遍历

缺点

缺点就是抛弃了相邻内存的这个优点,无法充分利用cpu缓存

近似深度优先搜索方法

这个头晕了,以后有空补补

简单说一下就是增加了一个页的概念,

多空间复制算法

GC复制算法最大的缺点就是只能利用半个堆

但是如果我们把from空间分隔成n个部分,例如100M一个部分,总共10个 1000M,那么我们只要每次只复制一个空间,to空间只需要100M即可

那内存利用率就到达了90%!

当然,这个需要使用到标记-清除  算法进行给对象打上标记,

复制from1到to成功之后,将to改为from1,同时将from1改为to空间,去复制from2.....

目录
相关文章
|
2月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
4月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
174 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
算法 Java
JVM有哪些垃圾回收算法?
(1)标记清除算法: 标记不需要回收的对象,然后清除没有标记的对象,会造成许多内存碎片。 (2)复制算法: 将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块区域,然后清空之前的区域。用在新生代 (3)标记整理算法: 与标记清除算法类似,但是在标记之后,将存活对象向一端移动,然后清除边界外的垃圾对象。用在老年代
32 0
|
4月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
4月前
|
算法 JavaScript 前端开发
垃圾回收算法的原理
【10月更文挑战第13天】垃圾回收算法的原理
47 0
|
4月前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
103 0
|
1天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
145 68
|
1月前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。

热门文章

最新文章