当不再需要某样东西时会发生什么?JavaScript 引擎如何发现并清理它? 比如: 你买了一瓶牛奶,你把牛奶喝光了,这时这个牛奶瓶子是不是垃圾呢?
例子
let user = {
name:"join"
}
这时 user 被 被全局 global 访问着, 那么这个 user 不会被垃圾回收,但是
user = null
把 user 的地址 改为 null的话,global 就无法访问到它,没有引用到它,这个user 就会被当做垃圾,并释放内存
还有一种情况就是 被两个人引用
let user = {
name:"join"
}
admin = user
这时 user 和 admin 都引用着同一个地址
user = null
这时,该对象仍然可以被全局global访问到,因为 admin 在引用这个对象地址
标记 + 清除 + 算法
定期执行以下"垃圾收集"步骤:
- 垃圾收集器扎根和"标记"(记住)他们。
- 然后,它访问和"标记"从他们的所有引用。
- 然后,它访问标记的对象,并标记其引用。所有被访问的对象都被记住,以便将来不要访问同一对象两次。
- ...等等,直到访问每一个可访问的(从根源)参考。
- 除标记对象外,所有对象均被删除。