JS——垃圾回收的原理

简介: JS——垃圾回收的原理

引言

JavaScript是一种高级的、解释型的编程语言,广泛应用于网页开发和移动应用开发中。在JavaScript中,内存管理是一个重要的话题,而垃圾回收就是内存管理的一部分。本文将介绍JavaScript垃圾回收的原理,并提供一些示例代码来帮助理解。

什么是垃圾回收

在编程中,我们使用变量来存储和操作数据。当我们不再需要某个变量或数据时,我们希望能够释放它所占用的内存空间,以便其他数据可以使用。垃圾回收就是一种自动管理内存的机制,它会自动识别和回收不再使用的内存。

垃圾回收的原理

JavaScript中的垃圾回收主要依靠垃圾收集器来实现。垃圾收集器会定期扫描内存,查找不再被引用的对象,并将其标记为垃圾。一旦对象被标记为垃圾,垃圾收集器就会释放它所占用的内存空间。

引用计数

一种常见的垃圾回收算法是引用计数。在引用计数算法中,每个对象都有一个引用计数器,用于记录有多少个引用指向该对象。当引用计数器为0时,表示该对象不再被引用,可以被回收。

然而,引用计数算法存在一个问题,就是循环引用。如果两个对象相互引用,它们的引用计数器都不会变为0,即使它们已经不再被使用。这种情况下,垃圾收集器需要使用其他算法来解决循环引用的问题。

标记-清除

标记-清除算法是另一种常见的垃圾回收算法。在标记-清除算法中,垃圾收集器首先会从根对象开始,遍历所有可访问的对象,并将它们标记为活动对象。然后,垃圾收集器会清除所有未被标记的对象,即垃圾对象。

标记-清除算法可以解决循环引用的问题,因为只有可访问的对象才会被标记为活动对象,不可访问的对象会被清除。

示例代码

下面是一个简单的示例代码,演示了JavaScript中垃圾回收的过程:

// 创建一个对象
let obj = { name: 'John' };
// 将obj赋值给另一个变量
let newObj = obj;
// 将obj设为null,表示不再引用该对象
obj = null;
// 此时,obj不再引用该对象,垃圾回收器会将其标记为垃圾
// 手动触发垃圾回收
// 这是一个非标准的方法,不同的JavaScript引擎可能有不同的实现
if (window.gc) {
  window.gc();
}

在上面的代码中,当将obj设为null时,表示不再引用该对象,垃圾回收器会将其标记为垃圾。然后,我们手动触发垃圾回收,以便立即释放该对象所占用的内存空间。

结论

垃圾回收是JavaScript中的重要概念,它可以帮助我们自动管理内存,避免内存泄漏和资源浪费。本文介绍了JavaScript垃圾回收的原理,并提供了一些示例代码来帮助理解。希望通过本文的介绍,你对JavaScript垃圾回收有了更深入的了解。

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