背景介绍
js内存空间有限,存储量超过原有内存空间大小会造成内存溢出,64位操作系统js内存量大概为1.4G左右,32位大概为700M左右。
因此需要回收无用存储,避免内存溢出。js回收无用内存有自己的一套规则我们称之为垃圾回收机制,js的垃圾回收机制是内部自动处理的,从而减轻了开发者的工作,在特殊情况下有些内存并不能被垃圾回收机制回收,了解垃圾回收机制的规则能让我们更有效的找出问题,避免造成内存溢出。
首先了解什么是可达性
代码示例
var user = {
name: '放放'
}
以上全局user引用了对象,对象内的name就是可达性
var user = {
name: '放放'
}
user.name = null
现在 name 变成不可达的状态,没有办法访问它,没有对它的引用。垃圾回收器将丢弃 name 数据并释放内存。
垃圾回收原理
(标记清除)
所有根变量和可访问变量的引用、引用链上的对象都会被标记,直到有未访问的引用(可以从根访问)为止,潍坊问的被标记清除并回收内存。
(引用计数)
每次从根变量和可访问变量的引用,引用链上的对象被引用时更新计数器加一,删除或者复制null为其减一,如果计数器为零则回收,否则不回收。
这就是垃圾收集的工作原理。JavaScript引擎应用了许多优化,使其运行得更快,并且不影响执行。
一些优化:
-
分代回收——对象分为两组:“新对象”和“旧对象”。许多对象出现,完成它们的工作并迅速结 ,它们很快就会被清理干净。那些活得足够久的对象,会变“老”,并且很少接受检查。
-
增量回收——如果有很多对象,并且我们试图一次遍历并标记整个对象集,那么可能会花费一些时间,并在执行中会有一定的延迟。因此,引擎试图将垃圾回收分解为多个部分。然后,各个部分分别执行。这需要额外的标记来跟踪变化,这样有很多微小的延迟,而不是很大的延迟。
-
空闲时间收集——垃圾回收器只在 CPU 空闲时运行,以减少对执行的可能影响。