JS垃圾回收的原理

简介: JS垃圾回收的原理

JavaScript的垃圾回收原理

JavaScript的垃圾回收(Garbage Collection)是一种自动内存管理机制,用于检测和回收不再使用的内存,以避免内存泄漏和资源浪费。

JavaScript的垃圾回收原理的实现步骤

垃圾回收的原理可以简单概括为以下几个步骤:

1.标记阶段(Marking):

垃圾回收器从根对象(通常是全局对象)开始,递归遍历所有对象,并标记处于活动状态的对象。通过可达性分析算法,判断哪些对象仍然被引用,而哪些对象已经不再被引用。

2.清除阶段(Sweeping):

在标记阶段完成后,垃圾回收器会对未被标记的对象进行清除。它会释放这些对象所占据的内存,并将这块内存标记为可重用。

3.压缩阶段(Compacting,非必须):

有些垃圾回收器还会有一个可选的压缩阶段。在此阶段,它会将存活的对象进行移动和整理,以便在堆内存中创建更大的连续空间,从而提高内存的利用率。

值得注意的是,JavaScript的垃圾回收并不依赖于开发者手动释放内存。相反,它是由垃圾回收器自动完成的。垃圾回收器会周期性地运行,以便在需要时清理不再使用的内存。

常见的垃圾回收机制和原理

下面介绍一些常见的垃圾回收机制和原理。

1.标记-清除(Mark and Sweep):

这是最常用的垃圾回收机制。它通过可达性分析算法进行工作,从根对象开始,递归遍历所有对象,并标记所有活动对象。标记阶段结束后,未被标记的对象即为垃圾对象,可以被清除回收。

2.引用计数(Reference Counting):

该机制会为每个对象维护一个引用计数器。当对象被引用时,计数器加一;当对象不再被引用时,计数器减一。当计数器为零时,说明对象不再被引用,可以被清除回收。然而,引用计数机制无法解决循环引用的问题,导致无法回收相互引用但不再被外部引用的对象。

3.分代收集(Generational Collection):

该机制基于观察到的对象生命周期特点,将对象划分为不同的代(generation)。新创建的对象位于新生代(young generation),经过一定次数的垃圾回收后,仍存活的对象被晋升到老生代(old generation)。分代收集根据不同代的特点采用不同的垃圾回收策略,如新生代通常使用副垃圾回收器和复制算法,而老生代则使用主垃圾回收器和标记-清除算法。

4.增量式回收(Incremental Collection):

为了减少垃圾回收造成的长时间阻塞,一些垃圾回收器采用增量式回收。该机制将垃圾回收过程分解为多个小步骤,每次执行一个小步骤后,释放主线程,使得其他任务有机会执行。通过分阶段执行回收过程,减少了单次回收所需的暂停时间。

以上是一些常见的垃圾回收机制和原理。具体的实现方式可能因浏览器、JavaScript引擎等不同而有所差异。JavaScript引擎会根据这些机制和原理进行自适应调整,以提高垃圾回收的效率和性能。

相关文章
|
9月前
|
Prometheus 监控 算法
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
|
6月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
274 19
|
9月前
|
存储 算法 Java
G1原理—5.G1垃圾回收过程之Mixed GC
本文介绍了G1的Mixed GC垃圾回收过程,包括并发标记算法详解、三色标记法如何解决错标漏标问题、SATB如何解决错标漏标问题、Mixed GC的过程、选择CollectSet的算法
G1原理—5.G1垃圾回收过程之Mixed GC
|
7月前
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
200 0
|
7月前
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
176 0
|
8月前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
JS回收机制方法讲解
|
9月前
|
存储 监控 架构师
ZGC圣经:ZGC垃圾回收器的原理、调优,ZGC 漏标的 分析与 研究
ZGC圣经:ZGC垃圾回收器的原理、调优,ZGC 漏标的 分析与 研究
|
9月前
|
存储 缓存 算法
G1原理—3.G1是如何提升垃圾回收效率
本文深入探讨了G1垃圾回收器提升GC效率的核心机制,包括记忆集(RSet)、位图(BitMap)和卡表(CardTable)的设计与作用。记忆集通过记录跨代引用避免了不必要的老年代遍历,位图用于高效描述内存使用状态以优化标记过程,而卡表则在节约记忆集内存的同时提供更详细的引用信息。此外,文章还解析了DCQ(Dirty Card Queue)和DCQS(Dirty Card Queue Set)机制如何异步更新RSet,确保在高并发场景下的性能与准确性。这些设计共同提升了G1在标记、清理及整理内存时的效率。
425 10
|
9月前
|
存储 算法 Java
G1原理—6.G1垃圾回收过程之Full GC
本文详细探讨了G1垃圾回收器对Full GC(FGC)的优化处理,涵盖FGC的前置处理、整体流程及并行化改进。重点分析了传统FGC串行化的局限性以及G1通过Region分区和RSet机制实现并行标记的优势,包括任务窃取提升效率、跨分区压缩以生成空闲Region等技术细节。此外,文章还介绍了G1的新特性——字符串去重优化,通过判断char数组一致性减少重复字符串占用内存,从而提升内存使用效率。总结部分全面回顾了G1在FGC中的各项优化措施及其带来的性能改善。
G1原理—6.G1垃圾回收过程之Full GC
|
9月前
|
存储 算法 Java
G1原理—4.G1垃圾回收的过程之Young GC
本文详细解析了G1垃圾回收器中YGC(Young Generation Collection)的完整流程,包括并行与串行处理阶段。内容涵盖YGC相关参数设置、YGC与Mixed GC及FGC的关系、新生代垃圾回收的具体步骤(如标记存活对象、复制到Survivor区、动态调整Region数量等),以及并行阶段的多线程操作和串行阶段的关键任务(如处理软引用、整理卡表、重构RSet)。
G1原理—4.G1垃圾回收的过程之Young GC