JavaScript中的垃圾收集器的方法技巧总结[图]

内存清除对于任何应用程序都是强制性的过程,包括那些用JS编写的应用程序。如果我们忽略此过程,则内存中将充满对象(大多数是“死”对象),并且在某些时候,根本就没有地方存放新数据。在本文中,我们将分析清除JS中的内存的基本原理,并考虑几种垃圾回收算法,并确定哪种效率更高。
什么是垃圾
垃圾是无法从“根”引用获得的任何对象。垃圾包括与根失去联系的所有“死物”。此外,“死”对象通常可以彼此链接,并形成相当大的尺寸链。尽管如此,它并没有使它们“活跃”,这就是为什么引用计数方法进行垃圾回收的方法行不通的原因。但是,哪个会工作呢?让我们从头开始。

JavaScript中的垃圾收集器的方法技巧总结[图]

垃圾收集方法
让我们考虑几种方法,从最简单和最快的方法开始,以最有效但最慢的方法结束。
扫描
这是最简单的垃圾搜索和删除算法。它仅在内存包含垃圾的情况下才起作用。如果仅填充活动对象,则“标记和扫描”将不执行任何操作。
MarkandSweep的主要缺点是会分散内存。结果,它可以清除很多空间,但是仍然不能在RAM中存储新的大对象。
紧凑标记扫描
Mark-Sweep-Compact算法具有非常必要的碎片整理功能。清除后,它将移动所有剩余的对象,并创建单个大块的可用内存空间。就结果而言,Mark-Sweep-Compact是最佳的。但是,转移对象的过程相当耗资源。此外,Mark-Sweep-Compact需要遍历内存两到三遍,这需要很多额外的时间。
半空间
SemiSpace(复制收集器)在某种程度上加快了清除和整理碎片的过程。SemiSpace查找活动对象,将它们复制到预先分配的空间,然后删除其余对象。
该算法比Mark-Sweep-Compact更简单,更快,但是需要更多空间来复制活动对象。此外,复制过程也很耗资源。
弱代假设
根据世代假设,年轻物体比旧物体更容易死亡。新创建的对象更有可能成为垃圾。因此,垃圾收集器更频繁地检查此类对象是合理的。
让我们考虑使用Java垃圾回收算法的分代方法。其工作方式如下:
所有的记忆分为年轻一代和老一代。
年轻一代分为以下几个时段:伊甸园,幸存者空间1和2(S0和S1)。
所有新物体都进入伊甸园。
在每次检查期间,该算法会将活动对象从Eden和一个S插槽传输到另一个S插槽,然后完全清除检查的插槽。

该算法依次检查S插槽:如果在上一次检查期间检查了Eden和S0插槽,并且将活动对象复制到S1,则在下一次检查期间,将检查Eden和S1,并将活动对象复制到S0。理智与情感读后感(https://www.yuananren.com/duhougan/18248.html)寿命足够长的物体正在向老一代转移。在这段时间内,他们设法进行了许多检查,并将继续以很高的概率存活。


在V8JS引擎中运行OrinocoGC垃圾收集器时,将应用类似的原理。
奥里诺科气相色谱
OrinocoGC会分割内存并根据对象的年龄移动对象,但是此算法有其细微差别:
记忆分为年轻记忆和旧记忆,但年轻记忆仅包含两个插槽:托儿所和中级。
一次在多个线程中执行内存检查。当将活动对象从Nursery移到Intermediate时,流将留下一个前向指针。这样做是为了使到达相同对象但沿着不同引用链的另一个线程不会尝试再次移动它。
OrinocoGC算法的工作原理如下:
所有新对象都转到Nursery,然后在检查了清道夫之后,尚存的对象移到了中级。其余的将被删除。
压缩内存并通过下一个Scavenger检查后,活动对象将转到旧内存。
旧内存的检查频率较低;该检查由主GC进行。
Orinoco中有两个垃圾收集器:一个用于检查年轻内存的辅助垃圾收集器(Scavenger),一个用于检查整个数组的主要垃圾收集器。紧凑阶段是可选的,用于主收集器的特权。由于移动对象仍然是一个消耗资源的过程,因此为了最小化此类动作,Orinoco使用了空闲列表。这些是内存中可用空间的列表,这些列表允许为新
对象定义合适的可用空间。如果内存过于分散并且对象没有合适的位置,则算法将进入精简阶段。
JS开发人员无权访问GC。这是一个实现细节。尽管JS无法直接调用收集器,但V8可以访问引擎嵌入到其中的环境。GC可以设置环境在空闲时间执行的任务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值