JavaScript垃圾回收机制

为什么要使用垃圾回收机制

垃圾回收机制是一种自动的内存管理机制。当计算机上的动态内存不再需要时,就应该予以释放,以让出内存。 没有及时释放不再使用的内存,就称为内存泄漏。直白点讲,就是程序的运行需要内存,当声明一个变量、定义一个函数时都会占用内存,内存的容量是有限的,如果变量,函数等只有产生没有消亡的过程,那迟早内存有被完全占用的时候。若不及时释放内存,则内存的占用越来越高,轻则影响程序和系统的性能,重则导致进程或系统的崩溃。所以,在计算机中,我们需要垃圾回收。需要注意的是,定义中的"自动"的意思是语言可以帮助我们回收内存垃圾,但并不代表我们不用关心内存管理,如果操作不当,JavaScript 中依旧会出现内存溢出的情况。

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。就是分配的内存不足以放下数据项序列,称为内存溢出。 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。

JS的垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存。

垃圾收集通常缩写为 “GC”,是JS中使用的内存管理系统的基本组成部分,它是靠浏览器中的垃圾回收器来回收处理的。
垃圾回收器是浏览器中的一个专门的线程,它每隔很短的时间就会运行一次,它主要作用是判断一个对象是否是垃圾对象,如果是,清除其内存数据,并标记内存是空闲状态。

判断垃圾对象

使用局部变量

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

当fn执行时,会创建a变量。此时在栈空间中会给他分配一块内存存储变量。
当fn执行结束后,由于不再需要变量a,所以此时的a就成为了垃圾变量。栈空间会立即释放之前给变量分配的内存。至此,垃圾回收完成。

使用对象

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

当对象创建时,此时的变量obj指向堆内存开辟的一块空间。
当我们给obj重新赋值为null时,变量obj和堆内存之间的联系断开。
由于此时堆内存中的空间没有被引用,所以这块空间就成为了JS中所谓的垃圾。

JS的垃圾回收方式

现在各大浏览器通常用采用的垃圾回收有两种方法:引用计数法、标记清除法。他们本质上都是找到未被引用的值,从而在垃圾回收执行时释放其空间。

  1. 引用计数法
    这是最初级的垃圾回收算法(老牌浏览器使用: IE) 。引用计数的策略是跟踪记录每个值被使用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,这个值得引用次数就加1,如果该变量的值变成了另一个,则这个值得引用次数就减1,当这个值的引用次数为0的时候,说明没有变量在使用,这个值无法访问。由此可以将其占用的空间回收,这些垃圾回收器就会在运行时清理掉引用次数为0的值占用的空间,但这种方法容易引起内存泄漏,因为这种方式没有解决循环引用的问题,如果2个对象内部存在相互引用,断开对象的引用后, 它们还不是垃圾对象,不会被回收。所以不建议使用!
var a = {} //count = 1
var b = a //count = 2
a = null //count = 1
b = null //count = 0 //垃圾对象
var o1 = {}; //count1 = 1
var o2 = {}; //count2 = 1
o1.m = o2 //count2 = 2
o2.n = o1 //count1 = 2
o1 = null //count1 = 1
o2 = null //count2 = 1
// 2个对象的计数值都为1,所以他们都不是垃圾对象。
  1. 标记清除法
    现代浏览器通常使用标记清除法。这是javascript中最常用的垃圾回收方式。它的工作原理是当变量进入环境(例如,在函数中声明一个变量)时,变量被标记为“在使用”,而当变量离开环境时(例如,函数执行结束),如果没有其他引用指向它,垃圾收集器会在未来的某个时间收集它并释放所占用的内存。
    在这里插入图片描述
    需要注意的是,
    在这里插入图片描述

总结

在JS中,凡是未被引用的变量或对象,都会被视为垃圾。并且JS目前主要是通过使用标记清除法实现垃圾回收。

  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值