javaScript v8引擎的垃圾回收(gc)浅析

一、v8数据存放

在程序运行时,存放数据地方主要分为堆内存和栈内存

  • 栈内存:因为使用的栈结构设计,所以叫栈内存,是一块连续的内存空间,处存储简单的数据,如基本类型(number、boolean、string)的值,复杂类型的堆内存指针也会存储在此,它是一个key、value的储存类型。栈内存的垃圾回收由系统自动直接管理,进行分配以及释放。
  • 堆内存:是一块不连续的内存空间,效率不如栈,可以存储栈内存的所有能储存的数据并且存储object数据。需要v8引擎主动去进行垃圾回收,这篇文章讲解的也是堆内存的垃圾回收(栈内存已经是系统自动管理了)。其中堆内存分为了
    • 新生代(New Space):最开始我们定义一个对象会先放入这里,一系列回收后还存在就会被放到老生代中

    • 老生代(Old Space):存储一些在新生代中经久存活(活动)的对象 和全局变量如window、docuement等。

    • 大对象空间(Large object space):存储一些超大对象,比如创建一个99999长度每个内容都有值的数组Array,那么此变量就会在这里创建存储,回收过程与老生代相同。

    • 代码空间(Code-space):编译器存储编译(JIT)JavaScript代码后得到的代码的地方。

    • 细胞空间,属性细胞空间,map 空间(Cell space, property cell space, and map space):这些空间分别包含:Cells, PropertyCells, 和 Maps。这些空间中的每个空间都包含相同大小的对象,并且对它们指向的对象有一些限制,从而简化了回收。


本文主要解析新生代(New Space)与老生代(Old Space)的GC过程。

看一个简单的例子,他们在内存中的分配

const a = 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值