带你读《现代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月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
46 1
|
1月前
|
JavaScript 前端开发 算法
JS垃圾回收
【10月更文挑战第30天】JavaScript 的垃圾回收机制是保证程序稳定运行的重要组成部分。了解垃圾回收的原理和算法,以及注意避免内存泄漏的问题,可以帮助开发者更好地利用 JavaScript 进行高效的开发
|
1月前
|
存储 JavaScript 前端开发
JavaScript的垃圾回收机制
【10月更文挑战第29天】JavaScript的垃圾回收机制是确保程序高效运行的重要保障,了解其工作原理和相关注意事项,有助于开发者更好地编写高性能、稳定的JavaScript代码。
|
2月前
|
存储 前端开发 JavaScript
JavaScript垃圾回收机制深度解析
【10月更文挑战第21】JavaScript垃圾回收机制深度解析
124 59
|
1月前
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
32 2
2024年5月node.js安装(winmac系统)保姆级教程
|
2月前
|
存储 JavaScript 算法
JS垃圾回收机制有哪些?
本文介绍了JavaScript中的垃圾回收(GC)机制,包括其概念、产生原因及重要性。文章详细讲解了几种常见的垃圾回收算法,如引用计数、标记清除、标记整理和分代回收,并分析了它们的优缺点。最后总结了垃圾回收对JS开发的重要作用,强调了其在自动内存管理和性能优化中的关键地位。
46 2
JS垃圾回收机制有哪些?
|
2月前
|
存储 JavaScript 前端开发
JavaScript垃圾回收机制与优化
【10月更文挑战第21】JavaScript垃圾回收机制与优化
42 5
|
5月前
|
JavaScript
vue中使用 HotKeys.js 教程(按键响应、快捷键开发)
vue中使用 HotKeys.js 教程(按键响应、快捷键开发)
231 0
|
2月前
|
JavaScript 前端开发
js教程——函数
js教程——函数
48 4
|
3月前
|
JavaScript 前端开发 Java
JavaScript基础知识-垃圾回收
关于JavaScript垃圾回收基础知识的介绍。
40 1
JavaScript基础知识-垃圾回收