欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 浅谈 JavaScript 的垃圾回收机制

浅谈 JavaScript 的垃圾回收机制

2024/10/24 6:28:57 来源:https://blog.csdn.net/weixin_68714627/article/details/140589278  浏览:    关键词:浅谈 JavaScript 的垃圾回收机制

前言

JavaScript 是一门具备垃圾回收机制的语言,这使得我们开发时无需手动分配和释放内存,先概括一下:垃圾回收器会自动 识别 清除 不再使用的对象,释放内存空间。

原理

  • 这里就不讲 IE 采用的引用计数垃圾收集..
  • 从 2012 年起,所有现代浏览器都使用了 标记 - 清除垃圾回收算法

标记 - 清除垃圾回收算法有两个阶段:

  1. 标记阶段垃圾回收器 会从 根对象 开始全局地查找,包括了全局对象、对象引用的对象,以及当前执行栈的变量,最终找到所有可以获得的对象和收集所有不能获得的对象。
  2. 清除阶段垃圾回收器 会从堆内存遍历出未被标记的对象,并将其视为垃圾,进行清除,释放内存。

技术都是在不断迭代,优化的:代际垃圾回收

为了提高垃圾回收效率,很多 JavaScript 引擎采用了代际垃圾回收机制,将内存空间分为新生代和老生代:

  • 新生代: 存放生命周期较短的对象,例如函数内部的局部变量。新生代采用 Scavenge 回收算法,效率较高。
  • 老生代: 存放生命周期较长的对象,例如全局变量。老生代采用标记-清除算法,效率相对较低。

对象会根据其存活时间在新生代和老生代之间迁移。

但是!有垃圾回收机制就不会有内存泄漏?

  • 假如你写了一个未声明或错误声明的变量会成为全局变量,那它不会被回收。
  • 假如你写的定时器未清除,则变量也不会被回收,因为定时器会引用到你在外部定义的变量吧,这是不是影响了垃圾回收机制的标识?
  • 类似的还有闭包,闭包函数会保留对外部函数变量的引用,如果闭包函数未被释放,则变量也不会被回收。

最后给大家提一个问题:

如果我在一个永远无法执行的条件语句中引用了某个变量,且这是这个变量唯一被引用的地方,那这个变量是会被标记还是会被回收呢?

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com