浅谈javaScript垃圾回收

文章介绍了JavaScript的内存管理机制,重点讲述了垃圾回收的概念,包括可达对象和垃圾的定义。接着,讨论了几种常见的垃圾回收算法,如引用计数、标记清除和标记整理。此外,文章详细阐述了V8引擎的垃圾回收策略,特别是对新生代和老生代对象的处理方式,以及如何通过分代回收、空间复制和标记增量来优化内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript内存管理

        内存管理介绍:

  1.    内存:由可读写单元组成,表示一片可操作空间。
  2.    管理:认为地去操作一片空间的申请、使用和释放。
  3.    内存管理:开发者主动申请空间、使用空间、释放空间。

JavaScript中的垃圾回收

        JavaScript中的垃圾

  1. JavaScript中内存管理是自动的。
  2. 对象不再被引用时是垃圾。
  3. 对象不能从根上访问到时是垃圾。

        JavaScript中的可达对象

  1. 可以访问到的对象就是可达对象(引用、作用域链)。
  2. 可达的标准就是从根出发是否能够被找到。
  3. JavaScript中的跟就可以理解为是全局变量对象。

        可达对象图示:

   如上图所示中对象皆为可达对象。而若将o1和Prev两条作用域链断开,则objec1将不再是可达对象,形成垃圾。

 

GC算法介绍

      GC定义与作用:

    GC就是垃圾回收机制的缩写。GC可以找到内存中的垃圾,并释放和回收空间。

       常见GC算法

  1. 引用计数
  2. 标记清除
  3. 标记整理
  4. 分代回收

        引用计数算法实现原理及优缺点

引用计数算法:

        核心思想:设置引用数,判断当前引用数是否为0

        引用计数器。

        引用关系改变时修改引用数字。

        引用数字为0时立即回收。

引用计数算法优点:

        发现垃圾时立即回收。最大限度减少程序暂停。

引用计数算法缺点:

        无法回收循环引用的对象。时间开销大。

        标记清除法实现原理及优缺点

标记清除法:

        核心思想:分标记和清除两个阶段完成。

        遍历所有对象寻找标记活动对象。

        遍历所有活动对象清除没有标记对象。

        回收相应的空间。

标记清除法优点:

        在找到第一层可达对象后,GC算法会用递归的方式继续找到可达对象,故可以回收循环引用的对象。

标记清除法缺点:

        容易产生碎片化空间,造成空间的浪费。且不会立即回收垃圾对象。

        标记整理法

        标记整理法可以看做是标记清除的增强。在标记阶段的操作和标记清除一致,清理阶段会先执行整理,移动对象位置,减少碎片化空间,但是回收效率慢。

V8垃圾回收策略

  1. 采用分代回收的思想。
  2. 内存分为新生代、老生代。
  3. 针对不同对象采用不同算法。

        V8垃圾回收策略图示

         V8中常用的GC算法

  1. 分代回收
  2. 空间复制
  3. 标记清除
  4. 标记整理
  5. 标记增量

        V8如何回收新生代对象

V8内存分配:

         V8内存空间一分为二,小空间用于存储新生代对象(32M|16M) /*对应64位系统和32位系统*/。新生代指的是存活时间较短的对象。

新生代对象回收实现:

  1. 回收过程采用复制算法+标记整理。
  2. 新生代内存区分为两个等大小空间。
  3. 使用空间为From,空闲空间为To,
  4. 活动对象存储一From空间。
  5. 标记整理后将活动对象拷贝至To。
  6. From与To交换空间完成释放。

回收细节补充说明:

        拷贝过程中可能出现晋升(晋升就是讲新生代对象移动到老生代),一轮GC还存活的新生代需要晋升。To空间的使用率不超过25%,以防影响拷贝交换。

        V8如何回收老生代对象

老生代对象说明:

        老生代对象存放在右侧老生代区域,64位操作系统为1.4G,32位操作系统为700M。老生代对象就是指存活时间较长的对象。

老生代对象回收实现:

  1. 主要采用标记清除、标记整理、标记增量法。
  2. 首先使用标记清除完成垃圾空间的回收。
  3. 采用标记整理进行空间优化。
  4. 采用增量标记进行效率优化。

细节对比:

        新生代区域垃圾回收使用空间换空间。

        老生代区域垃圾回收不适合复制算法。

标记增量如何优化垃圾回收:

         标记增量可以将当前一整段的垃圾操作,拆分成多个小步骤组合的去完成,这样做的好处主要可以实现垃圾回收与程序执行交替的完成,而不会阻塞进程。

V8总结

  1. V8是一款主流的JavaScript执行引擎。
  2. V8内存设置上限。
  3. V8采用基于分代回收思想实现垃圾回收
  4. V8内存分为新生代和老生代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值