开启掘金成长之旅!这是我参与「掘金日新计划 · 2更文挑战」的第9天 点击查看活动详情
内存泄漏
内存泄漏是指我们已经无法再通过 js 代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它。导致了分配的这块内存永远也无法被释放出来。如果这样的情况越来越多,会导致内存不够用而系统崩溃。
通过造成内存泄露的原因:
-
缓存
-
队列消费不及时
-
作用域未释放
清除方式1:标记清除
当变量命名好,编写完时,就将这个变量打上标记为“进入环境”。规定永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。
流程如下:
graph TD
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记**********-->
去掉运行环境中的变量以及被环境中变量所引用的变量的标记*********-->
有标记的变量就被视为准备删除的变量,原因是在运行环境中已经无法访问到这些变量了*************-->
垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间************
清除方式2:引用清除
简单点说呢,当你在定义一个变量时,他还在使用就说明他的引用次数是大于0,也就是说他还在被使用,所以不能被清除,当定义的变量运行完之后发现他的引用次数为0了,说明他没啥用了,所以你可以对他进行清除了
function example () {
var objA = new Object();
var objB = new Object();
objA.a = objB;
objB.b= objA;
}
在采用引用次数策略的实现中,当函数执行完毕后,objA和objB还将继续存在,因为它们的引用次数永远不会是0。
重复多次调用就会导致大量内存无法回收,etscape在Navigator 4.0中放弃了引用计数方式,转而采用标记清除来实现其垃圾回收机制。
V8垃圾回收策略
这一部分是涉及到算法的问题,如果有同学想了解的话,可以到这个地址去看下:www.php1.cn/detail/V8_Y…)
如何避免内存泄漏
1.尽可能少地创建全局变量
2.手动清除定时器
3.尽可能的不使用闭包