问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

浅析垃圾回收算法

发布网友 发布时间:2024-09-11 19:32

我来回答

1个回答

热心网友 时间:2024-09-15 23:02

前言

第一次接触到垃圾回收算法是在朴老师的《深入浅出Node.js》上,对于垃圾回收这个概念,我不免抛出一些疑问。垃圾在日常生活中我们非常熟悉,指的哪些我们用过的或者是无用的东西,那在js中哪些是垃圾呢?而回收的这个操作通常都是物业大妈干的事情,那在js又是谁在做这件事情呢?

我们来举个例子回答上述的问题,

vara={name:'hello'}a='world'

上述代码中,我们先声明了变量a,然后将a赋值了一个对象{name:'hello'},在js引擎分配内存的策略上,这个对象真实所占用的存储空间是在堆上的,而这个内存的地址是存放在栈上的,这就是我们前端常说的引用类型的存储方式。而下一行代码,我们将world赋值给a时,之前的对象就被后续引用,是不是变得有点像垃圾了。我们都知道内存是非常昂贵的,所以这是js引擎就会充当一部分物业大妈们的角色将这些垃圾收走。

概念介绍

通过上述例子的描述我们基本上知道了GC(GarbageCollection),干了件什么事情。然而对于做这件事情我们需要一定的策略,下面将会介绍两种常见的算法:半区复制法和标记清除法。半区复制法通常应用于对新生代(在内存中停留不久)对象处理,而标记清除法通常应用于对老生代(在内存中驻留)对象处理,那老生代对象是如何由来的呢?这个后面来解答一下。

这在里还有一个内存管理中行的概念需要阐述一下:可达性。就是那些以某种方式可访问或者说可用的值,它们被保证存储在内存中,反之不可访问则需回收。

半区复制法(Cheney算法)

对于新生代的对象来说,半区复制法是个不错的应对策略。Cheney算法中将堆内存一分为二,一个是处于使用状态的空间我们暂且称之为使用区,一个是处于闲置状态的空间我们称之为空闲区,如下图所示

新加入的对象都会存放到使用区,当使用区快被写满时,就需要执行一次垃圾清理操作。

当开始进行垃圾回收时,新生代垃圾回收器会对使用区中的活动对象做标记,标记完成之后将使用区的活动对象复制进空闲区并进行排序,随后进入垃圾清理阶段,即将非活动对象占用的空间清理掉。最后进行角色互换,把原来的使用区变成空闲区,把原来的空闲区变成使用区。

当一个对象经过多次复制后依然存活,它将会被认为是生命周期较长的对象,随后会被移动到老生代中,采用老生代的垃圾回收策略进行管理。

这里有一个疑问就是标记是如何实现的?有下面几种方法

当变量进入执行环境时,反转某一位(通过一个二进制字符来表示标记)

可以维护进入环境变量和离开环境变量这样两个列表,可以自由的把变量从一个列表转移到另一个列表

标记清除(Mark-Sweep)算法

标记清除(Mark-Sweep),目前在JavaScript引擎里这种算法是最常用的,到目前为止的大多数浏览器的JavaScript引擎都在采用标记清除算法,只是各大浏览器厂商还对此算法进行了优化加工,且不同浏览器的JavaScript引擎在运行垃圾回收的频率上有所差异。

此算法分为标记和清除两个阶段,标记阶段即为所有活动对象做上标记,清除阶段则把没有标记(也就是非活动对象)销毁

引擎在执行GC(使用标记清除算法)时,需要从出发点去遍历内存中所有的对象去打标记,而这个出发点有很多,我们称之为一组根对象,而所谓的根对象,其实在浏览器环境中包括又不止于全局Window对象、文档DOM树等

标记清除的过程大致如下:

垃圾收集器在运行时会给内存中的所有变量都加上一个标记,假设内存中所有对象都是垃圾,全标记为0

然后从各个根对象开始遍历,把不是垃圾的节点改成1

清理所有标记为0的垃圾,销毁并回收它们所占用的内存空间

最后,把所有内存中对象标记修改为0,等待下一轮垃圾回收

优点

标记清除算法的优点只有一个,那就是实现比较简单,打标记也无非打与不打两种情况,这使得一位二进制位(0和1)就可以为其标记,非常简单

缺点

标记清除算法有一个很大的缺点,就是在清除之后,剩余的对象内存位置是不变的,也会导致空闲内存空间是不连续的,出现了内存碎片(如下图),并且由于剩余空闲内存不是一整块,它是由不同大小内存组成的内存列表,这就牵扯出了内存分配的问题

假设我们新建对象分配内存时需要大小为size,由于空闲内存是间断的、不连续的,则需要对空闲内存列表进行一次单向遍历找出大于等于size的块才能为其分配(如下图)

那么如何在诸多的内存碎片碎片中找到一块合适的内存呢?这里有三种分配策略可供选择:

First-fit,找到大于等于size的块立即返回

Best-fit,遍历整个空闲列表,返回大于等于size的最小分块

Worst-fit,遍历整个空闲列表,找到最大的分块,然后切成两部分,一部分size大小,并将该部分返回

这三种分配策略需要在各种场景中测试来找到最佳策略,本质还是如何去平衡空间和比较次数的。

标记整理(Mark-Compact)算法

标记清除算法的缺点在于清除之后剩余的对象位置不变而导致的空闲内存不连续,所以只要解决这一点,两个缺点(内存碎片化和分配速度慢)都可以完美解决了

标记整理(Mark-Compact)算法就可以有效地解决,它的标记阶段和标记清除算法没有什么不同,只是标记结束后,标记整理算法会将活着的对象(即不需要清理的对象)向内存的一端移动,最后清理掉边界的内存(如下图),这样整合之后,内存的地址就会是连续的,这样方便了后续的内存分配。

总结

通过本文了解什么是所谓的垃圾,什么是可达性。

新生代常用的半区复制法(Cheney算法)以及标记清除(Mark-Sweep)算法的优缺点和标记整理(Mark-Compact)算法的优化点。

此外,我们还有几个疑问:

js是单线程的,那么GC(GarbageCollection)的时机是怎样的?

对于标记过的变量在下一次还需要继续标记吗?

在我们熟悉的v8当中这些算法到底是如何工作的?上述的问题我们下一次再来研究

参考文献

「硬核JS」你真的了解垃圾回收机制吗

《深入浅出Node.js》

热心网友 时间:2024-09-15 23:03

前言

第一次接触到垃圾回收算法是在朴老师的《深入浅出Node.js》上,对于垃圾回收这个概念,我不免抛出一些疑问。垃圾在日常生活中我们非常熟悉,指的哪些我们用过的或者是无用的东西,那在js中哪些是垃圾呢?而回收的这个操作通常都是物业大妈干的事情,那在js又是谁在做这件事情呢?

我们来举个例子回答上述的问题,

vara={name:'hello'}a='world'

上述代码中,我们先声明了变量a,然后将a赋值了一个对象{name:'hello'},在js引擎分配内存的策略上,这个对象真实所占用的存储空间是在堆上的,而这个内存的地址是存放在栈上的,这就是我们前端常说的引用类型的存储方式。而下一行代码,我们将world赋值给a时,之前的对象就被后续引用,是不是变得有点像垃圾了。我们都知道内存是非常昂贵的,所以这是js引擎就会充当一部分物业大妈们的角色将这些垃圾收走。

概念介绍

通过上述例子的描述我们基本上知道了GC(GarbageCollection),干了件什么事情。然而对于做这件事情我们需要一定的策略,下面将会介绍两种常见的算法:半区复制法和标记清除法。半区复制法通常应用于对新生代(在内存中停留不久)对象处理,而标记清除法通常应用于对老生代(在内存中驻留)对象处理,那老生代对象是如何由来的呢?这个后面来解答一下。

这在里还有一个内存管理中行的概念需要阐述一下:可达性。就是那些以某种方式可访问或者说可用的值,它们被保证存储在内存中,反之不可访问则需回收。

半区复制法(Cheney算法)

对于新生代的对象来说,半区复制法是个不错的应对策略。Cheney算法中将堆内存一分为二,一个是处于使用状态的空间我们暂且称之为使用区,一个是处于闲置状态的空间我们称之为空闲区,如下图所示

新加入的对象都会存放到使用区,当使用区快被写满时,就需要执行一次垃圾清理操作。

当开始进行垃圾回收时,新生代垃圾回收器会对使用区中的活动对象做标记,标记完成之后将使用区的活动对象复制进空闲区并进行排序,随后进入垃圾清理阶段,即将非活动对象占用的空间清理掉。最后进行角色互换,把原来的使用区变成空闲区,把原来的空闲区变成使用区。

当一个对象经过多次复制后依然存活,它将会被认为是生命周期较长的对象,随后会被移动到老生代中,采用老生代的垃圾回收策略进行管理。

这里有一个疑问就是标记是如何实现的?有下面几种方法

当变量进入执行环境时,反转某一位(通过一个二进制字符来表示标记)

可以维护进入环境变量和离开环境变量这样两个列表,可以自由的把变量从一个列表转移到另一个列表

标记清除(Mark-Sweep)算法

标记清除(Mark-Sweep),目前在JavaScript引擎里这种算法是最常用的,到目前为止的大多数浏览器的JavaScript引擎都在采用标记清除算法,只是各大浏览器厂商还对此算法进行了优化加工,且不同浏览器的JavaScript引擎在运行垃圾回收的频率上有所差异。

此算法分为标记和清除两个阶段,标记阶段即为所有活动对象做上标记,清除阶段则把没有标记(也就是非活动对象)销毁

引擎在执行GC(使用标记清除算法)时,需要从出发点去遍历内存中所有的对象去打标记,而这个出发点有很多,我们称之为一组根对象,而所谓的根对象,其实在浏览器环境中包括又不止于全局Window对象、文档DOM树等

标记清除的过程大致如下:

垃圾收集器在运行时会给内存中的所有变量都加上一个标记,假设内存中所有对象都是垃圾,全标记为0

然后从各个根对象开始遍历,把不是垃圾的节点改成1

清理所有标记为0的垃圾,销毁并回收它们所占用的内存空间

最后,把所有内存中对象标记修改为0,等待下一轮垃圾回收

优点

标记清除算法的优点只有一个,那就是实现比较简单,打标记也无非打与不打两种情况,这使得一位二进制位(0和1)就可以为其标记,非常简单

缺点

标记清除算法有一个很大的缺点,就是在清除之后,剩余的对象内存位置是不变的,也会导致空闲内存空间是不连续的,出现了内存碎片(如下图),并且由于剩余空闲内存不是一整块,它是由不同大小内存组成的内存列表,这就牵扯出了内存分配的问题

假设我们新建对象分配内存时需要大小为size,由于空闲内存是间断的、不连续的,则需要对空闲内存列表进行一次单向遍历找出大于等于size的块才能为其分配(如下图)

那么如何在诸多的内存碎片碎片中找到一块合适的内存呢?这里有三种分配策略可供选择:

First-fit,找到大于等于size的块立即返回

Best-fit,遍历整个空闲列表,返回大于等于size的最小分块

Worst-fit,遍历整个空闲列表,找到最大的分块,然后切成两部分,一部分size大小,并将该部分返回

这三种分配策略需要在各种场景中测试来找到最佳策略,本质还是如何去平衡空间和比较次数的。

标记整理(Mark-Compact)算法

标记清除算法的缺点在于清除之后剩余的对象位置不变而导致的空闲内存不连续,所以只要解决这一点,两个缺点(内存碎片化和分配速度慢)都可以完美解决了

标记整理(Mark-Compact)算法就可以有效地解决,它的标记阶段和标记清除算法没有什么不同,只是标记结束后,标记整理算法会将活着的对象(即不需要清理的对象)向内存的一端移动,最后清理掉边界的内存(如下图),这样整合之后,内存的地址就会是连续的,这样方便了后续的内存分配。

总结

通过本文了解什么是所谓的垃圾,什么是可达性。

新生代常用的半区复制法(Cheney算法)以及标记清除(Mark-Sweep)算法的优缺点和标记整理(Mark-Compact)算法的优化点。

此外,我们还有几个疑问:

js是单线程的,那么GC(GarbageCollection)的时机是怎样的?

对于标记过的变量在下一次还需要继续标记吗?

在我们熟悉的v8当中这些算法到底是如何工作的?上述的问题我们下一次再来研究

参考文献

「硬核JS」你真的了解垃圾回收机制吗

《深入浅出Node.js》

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
马自达cx9能换255-50r20的轮胎吗 不喜欢参加聚会怎么办 ...的电信8兆的宽带是169元每月可是用了2天就停机了,他说第一个月... 电信8兆宽带多少钱 爸妈想换5G套餐有没有那种可以绑定宽带一起的? ...换了波箱油后加速转速变高且偶有空转是怎么回事? 苦菜花的花语和寓意是什么? 苦菜花的花语是什么? 安徽省人事档案查询,调档等网上操作指南 安徽哪个网站调档 焦虑症与强迫症区别 焦虑症可以吃谷维素吗 躯体性焦虑症有哪些症状 焦虑症引起的肌肉酸痛怎么治 ps如何拉长腿p图大师告诉你 重庆五一职业技术学院是一所怎样的大专? 苹果电脑为什么连接无线网时需要WPA2密码? 如何解决苹果电脑连接无线网需要wpa2密码? 格力空调接入米家的方法 小米空调伴侣支持格力空调吗? 格力中央空调能接入米家吗? 格力空调怎么接入米家? 小米智能家居可以控制格力空调吗 格力空调可以使用米家吗 上海百秋和上海聚灵兽科技什么关系 呼和浩特中学排名从第一到第十是怎样? 龙门镖局惊涛掌的九式分别是 你用电,我用心;中国梦,国网情;安全用电,绿色家园。跪求三首藏头诗... iPhone打开勿扰模式后闹钟会不会响? 男性长胡须有什么作用,如果没有怎么没进化掉 一文带你了解经典的Java垃圾回收机制 尼日利亚的人口数量如何? 尼日利亚女篮实力如何 怎么清洗茶叶外面的茶垢如何清洗茶叶外面的茶垢 【合作签约】远算科技与水利部产品质量标准研究所签署战略合作协议... rom和ram哪个是内存,哪个是外存? 榆林赢速客食品配送服务有限公司怎么样? 杭州雨宝食品配送服务有限公司怎么样? 华为手机哪款防水 咖啡豆研磨的基本原则 什么茶利尿排毒 利尿排毒的茶有哪些 暮色3中最后被杀了的小女孩吸血鬼的演员叫什么啊? 天眼行动猜三个数字是几? 为什么我的360浏览器总是打开是空白页? 土豆丝汤的做法大全 土豆汤的做法 土豆汤的烹饪方法 2024国考报名缴费截止到哪天 胃管使用 试管促排期间注意事项 用胶粘的钻,抠掉了现在这样,怎么把胶去掉急!
  • 焦点

最新推荐

猜你喜欢

热门推荐