带你读《现代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 API
vue全屏滚动——vue-fullpage.js教程
vue全屏滚动——vue-fullpage.js教程
5 0
|
1天前
|
JavaScript 前端开发
vue页面滚动动画——wow.js教程
vue页面滚动动画——wow.js教程
5 0
|
1天前
|
JavaScript 前端开发 Java
node.js环境安装以及Vue-CLI脚手架搭建项目教程
node.js环境安装以及Vue-CLI脚手架搭建项目教程
|
1天前
|
JavaScript 前端开发
JavaScript高级四、高阶技巧
JavaScript高级四、高阶技巧
|
4天前
|
前端开发 JavaScript 容器
程序技术好文:纯原生javascript下拉框表单美化实例教程
程序技术好文:纯原生javascript下拉框表单美化实例教程
|
6天前
|
XML 缓存 JavaScript
一篇文章讲明白JS模板引擎之JST模板
一篇文章讲明白JS模板引擎之JST模板
10 2
|
7天前
|
JavaScript 前端开发 Java
深入ES6:解锁 JavaScript 类与继承的高级玩法
深入ES6:解锁 JavaScript 类与继承的高级玩法
|
7天前
|
前端开发 JavaScript 安全
解锁 JavaScript ES6:函数与对象的高级扩展功能
解锁 JavaScript ES6:函数与对象的高级扩展功能
|
8天前
|
JavaScript 前端开发 算法
JavaScript 使用自动垃圾回收机制来管理内存
JavaScript 使用自动垃圾回收机制来管理内存
9 0
|
13天前
|
JavaScript 前端开发 算法
JavaScript的垃圾回收机制
JavaScript的垃圾回收机制
8 0