1.垃圾回收
对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。
可达性(Reachability)
JavaScript 中主要的内存管理概念是 可达性。
简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。
-
这里列出固有的可达值的基本集合,这些值明显不能被释放。
比方说:
- 当前执行的函数,它的局部变量和参数。
- 当前嵌套调用链上的其他函数、它们的局部变量和参数。
- 全局变量。
- (还有一些内部的)
这些值被称作 根(roots)。
-
如果一个值可以通过引用链从根访问任何其他值,则认为该值是可达的。
比方说,如果全局变量中有一个对象,并且该对象有一个属性引用了另一个对象,则 该 对象被认为是可达的。而且它引用的内容也是可达的。
在 JavaScript 引擎中有一个被称作 垃圾回收器 的东西在后台执行。它监控着所有对象的状态,并删除掉那些已经不可达的。
垃圾回收算法:
JavaScript具有自动垃圾收集机制,也就是说,执行环境将负责管理代码执行过程中使用的内存。
在JavaScript中,如果一个对象不再被引用,那么这个对象就会被垃圾回收器回收,当对象被回收之后,这块内存就可以被再次使用。
JavaScript有两种垃圾回收机制:
1. 标记清除(Mark-and-sweep):这是JavaScript中最常见的垃圾收集方式,当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。
2. 引用计数(Reference counting):引用计数是另一种垃圾回收策略,引用计数的含义是跟踪每个值被引用的次数。当声明了一个变量并将一个引用类型值赋值给该变量时,这个值的引用次数就是1。如果同一个值又被赋值给另一个变量,那么这个值的引用次数就增加了1。相反,如果包含对这个值引用的变量又取得了另外一个值,那么这个值的引用次数就减少1。当这个值的引用次数变为0时,说明没有办法访问这个值了,因此就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次运行时,它就会释放那些引用次数为0的值所占用的内存。
这两种方式都有自己的优缺点,但标记清除是目前主流的垃圾回收方式,主要的原因是它不会导致循环引用的问题。
面试的时候,JavaScript的垃圾回收怎么回答?
JavaScript的垃圾回收是一种自动化的内存管理机制,用于帮助我们管理内存中不再使用的对象,以便释放内存空间供其他对象使用。当一个对象不再被引用时,垃圾回收机制会自动将其标记为"垃圾",然后在适当的时机进行回收和释放内存。
在面试时,你可以回答以下几个方面来解释JavaScript的垃圾回收:
1.引用计数:这是一种最早的垃圾回收算法,在JavaScript中并未广泛使用。它通过对每个对象记录引用数来决定对象是否为垃圾。当引用数为时,对象即被判定为垃圾,并被回收。然而,该算法存在循环引用的问题,循环引用的对象无法被回收。
2.标记-清除算法:这是JavaScript中最常用的垃圾回收算法。它通过从根对象开始进行遍历,标记所有能够访问到的对象,然后清除掉未被标记的对象,即垃圾对象。这个过程可以通过JavaScript解释器中的垃圾回收器自动执行。
3.并行和增量回收:为了提高垃圾回收的效率,现代浏览器通常采用并行和增量回收策略。并行回收利用多个线程来同时执行垃圾回收,减少回收过程对主线程的阻塞时间。增量回收则将垃圾回收过程分成多个小步骤,在执行每个小步骤之间允许主线程执行其他任务,从而减少垃圾回收对整体性能的影响。
4.内存泄漏:虽然JavaScript具有自动垃圾回收机制,但仍然存在内存泄漏的可能性。内存泄漏指当不再需要使用的对象仍然被引用时,垃圾回收器无法将其回收,导致内存使用量持续增加。常见的内存泄漏原因包括未及时释放事件监听器、闭包中的变量引用等。在开发过程中,需要注意及时释放不再使用的对象,避免内存泄漏问题。
总结:
垃圾回收简要回答:
(1)垃圾回收是JavaScript引擎的一种自动内存管理机制,主要负责找出那些不再继续使用的变量或对象,并释放其占用的内存。JavaScript中的垃圾回收主要基于“标记-清除”和“引用计数”两种策略。
(2)“标记-清除”是最常见的垃圾回收方式。它的工作原理是,垃圾回收机制定时运行,查找并标记所有活动对象,然后清除掉那些没有被标记的对象占用的内存。
(3)“引用计数”是另一种垃圾回收方式。它的工作原理是,每当引用关系改变时,如赋值或参数传递等,就修改引用计数。当某个对象的引用计数变为0时,就立即释放其占用的内存。
(4)JavaScript的垃圾回收是自动进行的,无需开发者手动操作,但了解这个过程对编写高效、优秀的JavaScript代码是十分有必要的。