2021/02/03 - V8引擎的垃圾回收
Opened this issue · 0 comments
lxinr commented
JavaScript 中主要的内存管理概念是可达性,即可以访问或可用的值,此时这个值它一定是在内存中的
-
一些固有的可达值的集合,这些值肯定不能被释放,如:
- 当前函数的局部变量和参数
- 嵌套调用时,当前调用链上所有函数的变量与参数
- 全局变量
这些值被称作根(roots)
-
如果一个值可以通过引用或引用链从根访问任何其他值,则认为该值是可达的
垃圾回收的内部算法被称为标记清除,此算法定期执行以下步骤:
- 垃圾收集器找到所有的
根,并“标记”(记住)它们 - 然后它遍历并“标记”来自它们的所有引用
- 然后它遍历标记的对象并标记 它们的 引用。所有被遍历到的对象都会被记住,以免将来再次遍历到同一个对象
- 重复...直到所有可达的(从根部)引用都被访问到
- 没有被标记的对象都会被删除
总结:
- 垃圾回收是自动完成的,我们不能强制执行或是阻止执行
- 当对象是可达状态时,它一定是存在于内存中的
- 被引用与可访问(从一个根)不同:一组相互连接的对象可能整体都不可达