这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
前言
栈用于保存基础数据以及变量,内存固定。堆保存的是引用类型。垃圾回收机制主要针对的是堆内存,即引用数据存放的位置
垃圾回收机制能够帮助我们自动回收内存,也有不能回收的情况,可能就有了内存泄漏的隐患
引用计数垃圾收集
初代算法
当引用类型的数据被赋值到变量的时候,计数加1;当变量改变,即不使用引用数据的时候,计数减1
垃圾回收机制进入结算环节的时候,会清除计数为0的引用数据的内存
缺点:不能解决互相引用的情况
标记清除算法
标记阶段
标记阶段,遍历根对象上的所有可访问对象,将之标记为可访问对象
清除阶段
当进入清除阶段的时候,遍历堆内存上的数据,清除没有标记为可访问对象的数据
内存泄漏
垃圾回收机制没有处理 & 开发没有处理 = 内存泄漏
- 局部作用域定义全局变量
function fun1 () {
a = 1
}
上述函数内部申明的遍历理应随着函数结束调用而被清理,但是意外变成了全局作用域的变量,变不会被清理
- 定时器
const timer = setInterval(() => {}, 1000)
定时器使用的频率也算比较多的,如果忘记清理定时器那便会一直执行下去
- 闭包
闭包的作用域是全局,或者闭包引用的参数来自于其他局部环境,都会导致内存不被清理
总结
-
从垃圾回收机制的角度看代码的运行,有助于我们规避问题和写出更好的代码
-
垃圾回收机制是帮助我们自动回收内存的,但也需要开发着注意内存泄漏方面的问题
-
本质是周期性的清除无用内存,效率取决于算法