垃圾回收

JS垃圾回收

首先我们说一下JS当中的数据类型

  • 基本类型

这些类型在内存中占据固定的内存空间,保存在栈空间,直接可以通过值去访问

  • 引用类型

由于引用类型值大小不固定,栈内存中放着地址指向堆内存中的对象,通过引用访问

总结:栈内存中的基本类型,可以通过操作系统直接处理,而堆内存中的引用类型,大小不固定,需要使用JS垃圾回收机制来处理

V8垃圾回收机制

  • 新生代内存回收 由于变量存活的时间短,因此分配的空间较小,64位系统大概32M 由两部分构成,From,To,From表示正在使用的内存空间,右边表示闲置的内存空间,当垃圾回收的的时候,V8会检测左边的对象是存活对象,如果是则将其复制到右边内存,否则直接回收,当左边清空之后,左右对调,循环处理!

对于零散的空间,会使用算法将其零散空间排列整体之后进行处理(scavenge)

  • 老生代内存回收 对于新生代中的变量经过回收之后依然一直存在,那么会被放入老生代的内存中,经过scavenge处理的都会晋升到老生代中!

清理过程:遍历堆上的对象,打上标记,代码执行结束之后,对变量进行取消标记,没取消的就是没有使用过的变量,取消的全部释放。标记清除之后,还会出现内存碎片的问题,使用标记整理进行操作。

内存泄漏的场景

  • 闭包
  • 定时器回调
  • 无效dom
  • 全局变量