带你读《现代Javascript高级教程》十一、JavaScript引擎的垃圾回收机制(2)

简介: 带你读《现代Javascript高级教程》十一、JavaScript引擎的垃圾回收机制(2)

带你读《现代Javascript高级教程》十一、JavaScript引擎的垃圾回收机制(1)https://developer.aliyun.com/article/1349621?groupCode=tech_library


3.  JavaScript引擎的垃圾回收优化策略

现代JavaScript引擎不仅实现了上述的基础垃圾回收算法,而且引入了一些优化策略,以提高垃圾回收的效率并减小对性能的影响。

1 分代收集

大部分的JavaScript对象在创建后很快就会死亡,而那些能活下来的对象,通常能活很久。这给了JavaScript引擎一个优化垃圾收集的思路。它把内存堆分为两个区域:新生代和老生代。新生代存放的是生存时间短的对象,老生代存放的是生存时间长的对象。

 

对新生代的垃圾回收采用Scavenge算法,它将新生代的空间一分为二,一个为使用空间(From),一个为空闲空间(To)。新对象总是被分配到From空间,当From空间快被使用完时,就会触发垃圾回收过程。

 

回收过程中,存活的对象将会被复制到To空间,同时From和To空间的角色会对调,也就是原来的To空间变成新的From空间。这个过程称为新生代的晋升策略。

 

而老生代的对象数量一般较多且存活时间较长,如果还使用上面的Scavenge算法就会占用较多的CPU,因此老生代采用了标记-清除和标记-整理算法。

2 延迟清除和增量标记

为了减小垃圾回收过程对应用程序性能的影响,JavaScript引擎采用了“延迟清除”(Lazy Sweeping)和“增量标记”(Incremental Marking)两种策略。

“延迟清除”是指,在标记-清除算法中,垃圾回收器并不是在标记完对象之后立即清除,而是将清除操作延迟到应用程序空闲时进行。

 

“增量标记”则是将一次完整的标记过程分解为几个部分,每个部分只标记一部分对象。这样,垃圾回收器可以在运行一小段时间后,暂停一会儿,让出CPU给应用程序,然后再运行一小段时间,如此反复,直到标记所有对象。这种方式可以让垃圾回收和应用程序交替运行,减小了垃圾回收对应用程序性能的影响。

3 JavaScript代码优化和垃圾回收

了解了垃圾回收的基本概念和机制后,我们可以通过优化JavaScript代码来减少垃圾回收的压力,提高程序的性能。以下是一些基本的策略:

a)局部变量和立即释放内存

使用局部变量而不是全局变量可以更快地释放内存。这是因为局部变量的生命周期通常比全局变量短,一旦离开了它的环境(例如:函数执行结束),局部变量就可以被标记为垃圾回收。

 

function test() {
    var local = "I'm a local variable";
    // 当函数执行结束后,local 就离开了环境,可以被垃圾回收}test();

b解除对象引用

当你不再需要一个对象时,应该解除对它的引用。这样,垃圾回收器在下一次运行时就可以回收这个对象。

 

var obj = { prop: "I'm an object" };
obj = null; // 现在,obj 可以被垃圾回收

c避免长生命周期的引用

长生命周期的引用(例如:全局变量或DOM引用)会阻止垃圾回收器回收它们所引用的对象。因此,应该尽量避免使用长生命周期的引用,或者在不再需要它们时及时解除引用。

 

在理解了JavaScript的垃圾回收机制和如何优化代码以减轻垃圾回收压力之后,我们可以写出更高效、更可靠的代码,从而提高用户体验,降低系统负载。

4. 总结

JavaScript的垃圾回收机制是一个复杂且精妙的系统,它能自动管理内存,让开发者可以专注于实现业务逻辑。虽然大多数时候我们不需要关心垃圾回收的具体过程,但是了解其工作原理,可以帮助我们编写出更高效、更具性能的代码,避免可能导致内存问题的代码模式。

相关文章
|
1月前
|
JavaScript 前端开发 物联网
JavaScript:构建动态世界的引擎
JavaScript:构建动态世界的引擎
|
1月前
|
前端开发 JavaScript 开发者
JavaScript:构建动态网络的引擎
JavaScript:构建动态网络的引擎
|
1月前
|
JavaScript 前端开发 开发者
JavaScript:驱动现代Web的核心引擎
JavaScript:驱动现代Web的核心引擎
|
1月前
|
JavaScript 前端开发 物联网
JavaScript:驱动现代Web的核心引擎
JavaScript:驱动现代Web的核心引擎
|
11月前
|
JavaScript 前端开发 算法
JS垃圾回收
【10月更文挑战第30天】JavaScript 的垃圾回收机制是保证程序稳定运行的重要组成部分。了解垃圾回收的原理和算法,以及注意避免内存泄漏的问题,可以帮助开发者更好地利用 JavaScript 进行高效的开发
|
4月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
193 19
|
11月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
338 1
|
7月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
6547 24
|
11月前
|
存储 JavaScript 前端开发
JavaScript的垃圾回收机制
【10月更文挑战第29天】JavaScript的垃圾回收机制是确保程序高效运行的重要保障,了解其工作原理和相关注意事项,有助于开发者更好地编写高性能、稳定的JavaScript代码。
|
6月前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
JS回收机制方法讲解

热门文章

最新文章