详解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.....

目录
相关文章
|
13天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
10天前
|
缓存 Java Python
python垃圾回收&缓存机制
python垃圾回收&缓存机制
|
18天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制(GC)
本文将探讨Java的自动内存管理核心——垃圾回收机制。通过详细解析标记-清除算法、复制算法和标记-整理算法等常用垃圾回收算法,以及CMS、G1等常见垃圾回收器,帮助读者更好地理解Java应用的性能优化和内存管理。同时,探讨分代收集、分区收集等策略在实际项目中的应用。结语部分总结了垃圾回收机制在Java开发中的重要性,并展望了未来可能的发展。
19 0
|
2月前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
53 4
|
3月前
|
存储 监控 算法
(六)JVM成神路之GC基础篇:对象存活判定算法、GC算法、STW、GC种类详解
经过前面五个章节的分析后,对于JVM的大部分子系统都已阐述完毕,在本文中则开始对JVM的GC子系统进行全面阐述,GC机制也是JVM的重中之重,调优、监控、面试都逃不开的JVM话题。
|
2月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
3月前
|
监控 算法 Java
Java面试题:如何在Java中触发一次Full GC?请详细解释垃圾回收机制和知识
Java面试题:如何在Java中触发一次Full GC?请详细解释垃圾回收机制和知识
260 4
|
3月前
|
存储 并行计算 安全
Java面试题:Java内存管理、多线程与并发框架的面试题解析与知识点梳理,深入Java内存模型与垃圾回收机制,Java多线程机制与线程安全,Java并发工具包与框架的应用
Java面试题:Java内存管理、多线程与并发框架的面试题解析与知识点梳理,深入Java内存模型与垃圾回收机制,Java多线程机制与线程安全,Java并发工具包与框架的应用
58 0
|
3天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
1月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
下一篇
无影云桌面