文章来源:https://segmentfault.com/a/1190000041218998

引用法

就是判断一个对象的引用数,引用数为 0 就回收,引用数大于 0 就不回收:

let obj1 = { name: '林三心', age: 22 }
let obj2 = obj1
let obj3 = obj1

obj1 = null
obj2 = null
obj3 = null

Untitled

引用法是有缺点的,下面代码执行完后,按理说obj1和obj2都会被回收,但是由于他们互相引用,各自引用数都是1,所以不会被回收,从而造成内存泄漏

function fn () {
  const obj1 = {}
  const obj2 = {}
  obj1.a = obj2
  obj2.a = obj1
}
fn()

Untitled

标记法

标记法就是,将可达的对象标记起来不可达的对象当成垃圾回收

那问题来了,可不可达,通过什么来判断呢?(这里的可达,可不是可达鸭)

Untitled

言归正传,想要判断可不可达,就不得不说可达性了,可达性是什么?就是从初始的根对象(window或者global)的指针开始向下搜索子节点,子节点被搜索到了,说明该子节点的引用对象可达,并为其进行标记,然后接着递归搜索,直到所有子节点被遍历结束。那么没有被遍历到节点,也就没有被标记,也就会被当成没有被任何地方引用,就可以证明这是一个需要被释放内存的对象,可以被垃圾回收器回收

// 可达
var name = '林三心'
var obj = {
  arr: [1, 2, 3]
}
console.log(window.name) // 林三心
console.log(window.obj) // { arr: [1, 2, 3] }
console.log(window.obj.arr) // [1, 2, 3]
console.log(window.obj.arr[1]) // 2

function fn () {
  var age = 22
}
// 不可达
console.log(window.age) // undefined

Untitled

普通的理解其实是不够的,因为垃圾回收机制(GC)其实不止这两个算法,想要更深入地了解V8垃圾回收机制,就继续往下看吧!!!

JavaScript 内存管理

其实JavaScript内存的流程很简单,分为3步: