专栏名称: 大淘宝技术
淘系技术官方账号
目录
相关文章推荐
OSC开源社区  ·  共筑鸿蒙生态!6.20上海「HarmonyO ... ·  3 天前  
OSC开源社区  ·  Gitee ... ·  11 小时前  
OSC开源社区  ·  走进群核科技丨AI 数据全链路闭环加速沙龙 ·  2 天前  
51CTO官微  ·  本命周!MiniMax ... ·  昨天  
51好读  ›  专栏  ›  大淘宝技术

QuickJS的垃圾回收算法

大淘宝技术  · 公众号  · 程序员  · 2024-10-28 18:41

正文

请到「今天看啥」查看全文




  • 可达性分析


相较于RC,可达性分析的逻辑就比较复杂。可达性分析的算法基础在于,在程序运行的某些时刻,有一些对象是肯定不应该被回收的。这些对象,我们称其为GC Roots。常见的GC Roots有当前栈上的变量,全局变量等等。


那么我们只需要以这些Roots为起点,不断向下遍历它所持有的对象,就可以认为这些被遍历到的都是有可能存活的对象。而剩下的,就是一些垃圾了。



如何回收


确定了这些垃圾对象,接下来要做的就是回收工作。如何回收?主要有以下这些算法:


  • GC标记清除法


顾名思义,这个算法分为两步,标记 + 清除。标记就是使用之前提到的可达性分析,而清除就是将未被标记的对象全部回收。


  • GC复制算法


复制算法,将对象分配空间分为大小完全相同的两块,其中一块称为from,另一块称为to。当我们申请内存时,只在from空间中分配。而当我们进行垃圾回收时,我们则将from空间中所有的存活对象全部复制到to空间中,然后将整块from空间回收,之后将两块空间身份对换。


  • GC标记压缩法


标记压缩法,听起来和标记清除有点类似。事实上,标记压缩的前两步和标记清除完全一样,都是标记存活对象,将垃圾全部清除。而标记压缩会在清除之后,增加一步内存整理工作,用以减少可能的内存碎片问题。


其他一些算法


  • 分代算法


分代算法是一种经验算法,即在大多数情况下,程序内的对象都是在创建完成后很快被回收。按照这个经验,可以将heap分为两块,其中一块称为年轻代,用以分配那些申请的内存,另一块则称为老年代,用以存储那些满足条件的对象。







请到「今天看啥」查看全文