JS的垃圾回收机制

垃圾回收是计算机编程中的一个术语,用来描述查找和删除那些不再被其他对象引用的对象的处理过程。换句话说,垃圾回收是删除任何其他对象未使用的对象的过程。如果没有垃圾回收机制,那么对象将会一直占用系统中的可用内存,如果不释放掉这些内存的话,就将直接导致系统崩溃。

垃圾回收器#

垃圾收集通常缩写为 "GC",是JS中使用的内存管理系统的基本组成部分,它是靠浏览器中的垃圾回收器来回收处理的。

垃圾回收器是浏览器中的一个专门的线程,它每隔很短的时间就会运行一次,它主要作用是判断一个对象是否是垃圾对象,如果是,清除其内存数据,并标记内存是空闲状态。

判断垃圾对象#

function fn() {
	var a = 1
}
fn()

用最简单的函数执行过程距离,当调用fn(),会创建变量a,此时在栈空间中会给他分配一块内存存储变量

fn()执行结束,由于不再需要变量a,此时其成为垃圾变量,栈空间会释放之前给其的内存,而这个过程就是垃圾回收

var obj = {
	name: "Tom",
	age: "18",
};
obj = null;

当对象创建时,此时的变量obj指向堆内存开辟的一块空间;当给obj重新赋值为null时,变量obj和堆内存之间的联系断开。

由于此时堆内存中的空间没有被引用,所以这块空间就成为了JS中所谓的垃圾。

两个特例#

全局变量#

由于挂载到window的全局变量只在页面卸载时进行销毁,所以程序很难对全局变量是否为垃圾对象进行判断,所以这也是尽量少声明全局变量的原因之一,或者在使用完变量后重新赋值为null

闭包#

由于闭包引用了外部函数的变量,所以当闭包被使用时,垃圾回收机制也无法对外层函数被引用的变量进行回收。所以需要手动把使用闭包的变量赋值为null

回收策略#

  • 引用计数法

引用计数算法定义内存不再使用的标准很简单,就是看一个对象是否有指向它的引用。如果没有其他对象指向它了,说明该对象已经不再需要了。

// 创建一个对象person,他有两个指向属性age和name的引用
var person = {
    age: 12,
    name: 'aaaa'
};
 
person.name = null; // 虽然设置为null,但因为person对象还有指向name的引用,因此name不会回收
 
var p = person;
person = 1;         //原来的person对象被赋值为1,但因为有新引用p指向原person对象,因此它不会被回收
 
p = null;           //原person对象已经没有引用,很快会被回收

缺点是无法将那些循环引用的对象进行回收,而且它所消耗的时间长

function fn(){
    const obj1 = {};
    const obj2 = {};
    obj1.name = obj2;
    obj2.name = obj1;
}
fn();
  • 标记清除法

一是遍历所有的对象找到活动对象进行标记,二是遍历所有的对象将没有标记的对象进行清除,同时把第一阶段做的标记给抹掉。经过这两次方便将垃圾空间进行回收。

它的优点是可以解决循环引用的对象进行回收,它的缺点是产生空间碎片化,当前所回收的垃圾对象在内存空间地址上不连续,由于不连续导致回收之后分散到各个角落,后续使用的时候如果新的申请空间大小匹配则可以直接使用,否大过大或过小就不适合使用。其次它也不会立即回收对象。

  • 标记清除整理

标记整理算法可以看做是标记清除算法的增强版,它的第一阶段遍历所有的对象找到可达对象进行标记,它的第二阶段会在清除之前先去进行整理的操作,移动对象的位置让他们在地址上产生连续,然后再做清除的操作。

它的优点是解决了标记清除的空间碎片化,它的缺点是不会立即回收对象。

  • Cheney算法:用于v8新生代垃圾回收

对V8引擎、GC算法、新老生代等想进一步探寻的看官,请查找更多资料,这里不再深入。

posted @   辜负寒彻骨  阅读(199)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
  1. 1 逝年 夏小虎
逝年 - 夏小虎
00:00 / 00:00
An audio error has occurred.

作词 : 刁云逸

作曲 : 夏小虎

风里飘雪的花

在记忆之中发芽

那些红色绿色

我们的青春年华

志向无限远大

转眼已各奔天涯

独自走在街上

只看见曾经的晚霞

时间似流水

催促我们长大

年轻的心有了白发

当初的人呐

你们如今在哪

是否也在寻找梦的家

风里飘雪的花

在记忆之中发芽

那些红色绿色

我们的青春年华

志向无限远大

转眼已各奔天涯

独自走在街上

只看见曾经的晚霞

时间似流水

催促我们长大

年轻的心有了白发

当初的人呐

你们如今在哪

是否也在寻找梦的家

时间似流水

催促我们长大

年轻的心有了白发

当初的人呐

你们如今在哪

是否也在寻找梦的家

点击右上角即可分享
微信分享提示
主题色彩