lxinr/interview-question

2021/02/03 - V8引擎的垃圾回收

Opened this issue · 0 comments

lxinr commented

JavaScript 中主要的内存管理概念是可达性,即可以访问或可用的值,此时这个值它一定是在内存中的

  • 一些固有的可达值的集合,这些值肯定不能被释放,如:

    • 当前函数的局部变量和参数
    • 嵌套调用时,当前调用链上所有函数的变量与参数
    • 全局变量
      这些值被称作根(roots
  • 如果一个值可以通过引用或引用链从根访问任何其他值,则认为该值是可达的

垃圾回收的内部算法被称为标记清除,此算法定期执行以下步骤:

  • 垃圾收集器找到所有的,并“标记”(记住)它们
  • 然后它遍历并“标记”来自它们的所有引用
  • 然后它遍历标记的对象并标记 它们的 引用。所有被遍历到的对象都会被记住,以免将来再次遍历到同一个对象
  • 重复...直到所有可达的(从根部)引用都被访问到
  • 没有被标记的对象都会被删除

总结:

  1. 垃圾回收是自动完成的,我们不能强制执行或是阻止执行
  2. 当对象是可达状态时,它一定是存在于内存中的
  3. 被引用与可访问(从一个根)不同:一组相互连接的对象可能整体都不可达
FROM:

https://zh.javascript.info/garbage-collection