JS 垃圾回收

内存

JS 数据的存储地址分为栈内存堆内存

栈内存
  存放基础数据类型(如: String Number Boolean Symbol)以及函数和对象的引用地址
堆内存
  存放对象的具体值

在 JS 存放数据的内存中又分为高位低位,其中高位存放栈数据,低位存放堆数据,堆数据不可控数据的大小。

垃圾回收(Garbage Collection)

堆数据的垃圾回收

在堆数据中,又分为新生代数据老生代数据,新生代数据是指新创建的数据,老生代是指在新生代数据中被标记存活下来的数据,也就是上一次扫描中没有被清理掉的数据,老生代不容易被回收。

对于新生代数据使用 scavenge 算法。具体是将新生代数据的内存一分为二,分别为 fromto

第一次创建的堆数据将进入 from 中。from 中的数据如果满了,将进行一次 GC 。也就是对 from 中的堆数据遍历一次进行标记清除。标记的数据将全部拷贝到 to 中,然后清除掉 from 中的数据。然后再次新创建的数据将放到 to 中。如果 to 的内存满了,又会进行一次 GC。上一次 GC 中被标记的数据将进入到老生代内存中。也就是说新生代的数据有一部分晋升了。

对于老生代数据的垃圾回收是标记清楚+标记整理
老生代内存满了会触发一次 GC,遍历一遍老生代数据,删除没有被使用的数据。剩余的数据段会存在不连续,还有内存,分配不了大数据的问题。所以会进行标记整理,也就是对老生代数据进行移动整合内存段,但是这样会造成浏览器卡顿。所以会进行增量标记增量整理,每次只移动一段。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 使用JavaScript进行前端开发时几乎完全不需要关心内存管理问题,对于前端编程来说,V8限制的内存几乎不会出现...
    写Blog不取名阅读 13,737评论 9 20
  • js中的垃圾都是自动的,我们不需要手动回收垃圾;通常认为对象不再被引用时是垃圾,对象从根上(全局对象)向下一级一级...
    少_游阅读 1,007评论 0 0
  • 在 JS 中 值类型数据存储在 栈空间中,引用类型的数据存储在堆空间中。有些数据被使用之后,就不需要了,我们需...
    _1633_阅读 2,732评论 0 1
  • 关于V8 V8是一款主流的js执行引擎。它是为JS在浏览器执行而打造的。因此不会遇到大量使用内存的场景。所以它申请...
    小q阅读 3,395评论 0 0
  • 1、关于内存 每个应用程序都占用一定的内存,因为内存是有限的,因此需要一个内存管理回收机制。例如C语言 #incl...
    冯艳辉brook阅读 6,634评论 0 48