JavaScript 垃圾收集机制(详细介绍)

变量的生命周期

当一个变量的生命周期结束之后它所指向的内存就应该被释放。JS有两种变量,全局变量和在函数中产生的局部变量。局部变量的生命周期在函数执行过后就结束了,此时便可将它引用的内存释放(即垃圾回收),但全局变量生命周期会持续到浏览器关闭页面。

垃圾收集介绍

此段话由《JavaScript高级程序设计》第三版 第四章4.3垃圾收集 所介绍:
JavaScript具有自动垃圾回收机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。 而C和C++之类的语言中是没有的。所以开发人员的一项基本任务就是手动跟踪内存的使用情况,这是造成许多问题的一个根源。
JavaScript开发者可以不用关心内存的适用问题,所需内存的分配以及无用内存的挥手完全实现了自动管理

垃圾收集方式 – 标记清除

JS中最常用的垃圾收集方式就是标记清(mark-and-sweep)。当变量进入执行环境(函数中声明变量)时。就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。而变量在离开环境是,则将其标记为“离开环境”。(函数内部的就是就是函数执行完成的时候被标记)
在离开环境之后还存在的变量就是需要被删除变量。
至于标记方式可以是某个特殊位的反转或维护一个列表等。这个并不重要,关键在于用什么回收方式。
****** 垃圾收集器在运行的时候会给 存储在内存中的所有变量都加上标记。 然后他会去掉 环境中的变量和被 环境中的变量所引用的变量的标记
******* 在此后再被加上的标记的变量就是被当做是 需要回收的变量 原因是因为环境中的变量已经无法访问到这些变量了

垃圾收集方式 – 引用计数

这是一种不太常见的垃圾收集策略 引用计数(reference counting)。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量是,则这个值的引用次数就是1。如果同一个值又被赋值给另外一个变量,该值的引用次数加1。相反,如果包含对这个值引用的变量重新取了另外一个值那么该值的引用次数减1。当该值的引用次数为0时,则说明没办法访问该值了。垃圾回收器就会将该值回收,下次垃圾回收器运行时会继续寻找那引用次数为0的值并将它们回收。
所以这种方式问题非常多比如

function problem(){
	let obj_a = new Object();
	let obj_b = new Object(); 
	obj_a.children = obj_b;
	obj_b.children = obj_a;
}

这个函数执行结束之后obj_a 和 obj_b 的引用次数都不为0所以是无法被收集器清除的

那么什么是垃圾

一般来说没有被引用的对象就是垃圾,就是要被清除, 有个例外如果几个对象引用形成一个环,互相引用,但根访问不到它们,这几个对象也是垃圾,也要被清除。

总结

所以垃圾回收机制主要是针对函数防止发送内存泄漏。因为在写代码中会创建很多局部环境,局部环境下会创建很多局部变量。

内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值