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

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

十一、JavaScript引擎的垃圾回收机制

引言

在编程语言中,内存管理是一项关键的任务,尤其对于构建大规模和性能敏感的应用程序来说尤为重要。然而,对于JavaScript这种动态语言来说,开发者通常不需要(也无法)直接管理内存,这项任务主要由JavaScript引擎来完成。

这种自动管理的机制让开发者可以更专注于业务逻辑的实现,而不用担心内存泄漏或溢出等问题。但同时,作为开发者,了解JavaScript引擎如何管理内存,如何进行垃圾回收(Garbage Collection,简称GC),也是很有价值的。这种理解可以帮助我们编写出更高效、更具性能的代码,避免可能导致内存问题的代码模式。

  1. JavaScript内存生命周期

在讨论垃圾回收之前,我们首先需要了解一下JavaScript的内存生命周期,这个过程通常分为三个阶段:

 

  • 分配内存:当声明变量、添加属性、或者调用函数等操作时,JavaScript引擎会分配内存来存储值。例如,当你写let a = 1时,JavaScript引擎会为变量a分配一块内存来存储值1
  • 使用内存:在分配了内存之后,我们可以通过读写操作来使用这块内存。例如,我们可以读取变量a的值,或者改变它的值。
  • 释放内存:当内存不再被需要时(例如,变量已经离开了它的作用域),这块内存需要被释放,以便为新的内存分配做出空间。这个过程就是垃圾回收。

2. 垃圾回收

垃圾回收是自动完成的。垃圾收集器会周期性地(或在特定触发条件下)运行,找出不再使用的变量,然后释放其占用的内存。但是,如何确定哪些内存“不再需要”呢?这其实是一个复杂的问题,因为某些内存可能仍然被间接引用,或者可能在将来需要。

 

因此,垃圾收集器必须使用一种算法来确定哪些内存可以安全地释放。接下来我们将详细介绍两种常见的垃圾回收算法:标记-清除算法和引用计数算法。

1 标记-清除算法

这是JavaScript中最常用的垃圾回收算法。它的工作原理大致可以分为两个阶段:标记和清除。

 

在标记阶段,垃圾回收器从一组“根”(root)对象开始,遍历所有从这些根对象可达的对象。可达的对象包括直接引用的对象,以及通过其他可达对象间接引用的对象。所有可达的对象都被标记为“活动的”或“非垃圾的”。

 

然后,在清除阶段,垃圾回收器会遍历所有的堆内存,清除未被标记的对象。这些未被标记的对象就是我们所说的“垃圾”,它们无法从根对象访问到,因此我们可以安全地假设它们不会再被应用程序使用。

 

function test() {
    var x = 123;
    var y = { a: 1, b: 2 };
// 当函数执行结束时,x 和 y 就离开了环境}test();
// 现在 x 和 y 都是非环境变量,它们占用的内存就可以被垃圾回收器回收

2 引用计数算法

引用计数是另一种垃圾回收策略。这种策略的基本思想是跟踪每个对象被引用的次数。当声明一个变量并将一个引用类型值赋给该变量时,这个引用类型值的引用次数就是1。如果同一个引用值被赋给另一个变量,引用次数增加1。相反,如果对该值的引用被删除,引用次数减少1。当这个引用次数变成0时,就表示没有任何地方再引用这个值了,因此该值可以被视为“垃圾”并被收集。

 

然而,引用计数算法有一个著名的问题,那就是循环引用。如果两个对象相互引用,即使它们没有被其他任何对象引用,它们的引用次数也不会是0,因此它们不会被回收,这会导致内存泄漏。为了解决这个问题,现代JavaScript引擎通常会结合使用标记-清除和引用计数两种算法。

 

function cycleReference() {
    var obj1 = {};
    var obj2 = {};
    obj1.prop = obj2;
    obj2.prop = obj1;}cycleReference();// 在函数执行结束后,obj1 和 obj2 仍然相互引用,但已经离开了环境,无法被引用计数器捕获


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

相关文章
|
19天前
|
JavaScript 前端开发 算法
JS垃圾回收
【10月更文挑战第30天】JavaScript 的垃圾回收机制是保证程序稳定运行的重要组成部分。了解垃圾回收的原理和算法,以及注意避免内存泄漏的问题,可以帮助开发者更好地利用 JavaScript 进行高效的开发
|
19天前
|
存储 JavaScript 前端开发
JavaScript的垃圾回收机制
【10月更文挑战第29天】JavaScript的垃圾回收机制是确保程序高效运行的重要保障,了解其工作原理和相关注意事项,有助于开发者更好地编写高性能、稳定的JavaScript代码。
|
29天前
|
存储 前端开发 JavaScript
JavaScript垃圾回收机制深度解析
【10月更文挑战第21】JavaScript垃圾回收机制深度解析
99 59
|
1月前
|
存储 JavaScript 算法
JS垃圾回收机制有哪些?
本文介绍了JavaScript中的垃圾回收(GC)机制,包括其概念、产生原因及重要性。文章详细讲解了几种常见的垃圾回收算法,如引用计数、标记清除、标记整理和分代回收,并分析了它们的优缺点。最后总结了垃圾回收对JS开发的重要作用,强调了其在自动内存管理和性能优化中的关键地位。
35 2
JS垃圾回收机制有哪些?
|
29天前
|
存储 JavaScript 前端开发
JavaScript垃圾回收机制与优化
【10月更文挑战第21】JavaScript垃圾回收机制与优化
28 5
|
4月前
|
JavaScript
vue中使用 HotKeys.js 教程(按键响应、快捷键开发)
vue中使用 HotKeys.js 教程(按键响应、快捷键开发)
204 0
|
1月前
|
JavaScript 前端开发
js教程——函数
js教程——函数
36 4
|
2月前
|
JavaScript 前端开发 Java
JavaScript基础知识-垃圾回收
关于JavaScript垃圾回收基础知识的介绍。
36 1
JavaScript基础知识-垃圾回收
|
1月前
|
JavaScript 前端开发 Java
JS引擎V8
【10月更文挑战第9天】
26 0
|
1月前
|
JavaScript 前端开发 Java
Node.js 教程
10月更文挑战第1天
41 0
下一篇
无影云桌面