垃圾回收

126 阅读1分钟

当不再需要某样东西时会发生什么?JavaScript 引擎如何发现并清理它? 比如: 你买了一瓶牛奶,你把牛奶喝光了,这时这个牛奶瓶子是不是垃圾呢?

例子

let user = {
    name:"join"
 }

image.png 这时 user 被 被全局 global 访问着, 那么这个 user 不会被垃圾回收,但是

user = null

image.png 把 user 的地址 改为 null的话,global 就无法访问到它,没有引用到它,这个user 就会被当做垃圾,并释放内存

还有一种情况就是 被两个人引用

let user = {
    name:"join"
}

admin = user

image.png

这时 user 和 admin 都引用着同一个地址

user = null

这时,该对象仍然可以被全局global访问到,因为 admin 在引用这个对象地址

标记 + 清除 + 算法

定期执行以下"垃圾收集"步骤:

  • 垃圾收集器扎根和"标记"(记住)他们。
  • 然后,它访问和"标记"从他们的所有引用。
  • 然后,它访问标记的对象,并标记引用。所有被访问的对象都被记住,以便将来不要访问同一对象两次。
  • ...等等,直到访问每一个可访问的(从根源)参考。
  • 除标记对象外,所有对象均被删除。

image.png