1.什么是垃圾?
可达性:指那些以某种方式可以访问到或可以用到的值,它们被保证存储在内存中
1.没有被引用的对象或者变量
2.无法被访问到的对象
2.垃圾回收器
垃圾回收器是浏览器中的一个专门的线程,它每隔很短的时间就会运行一次,它主要作用是判断一个对象是否是垃圾对象,如果是,清除其内存数据
3.垃圾回收机制
1.引用计数:
- 每个对象内部都标记一下引用次数,被引用一次,次数加1,当引用次数为0时,进行清除
- 缺点:引用计数方法可能导致循环引用,类似死锁,导致内存泄露。例如:
function problem() {
var objA = new Object();
var objB = new Object();
objA.someOtherObject = objB;
objB.anotherObject = objA;
}
objA和objB相互引用,两个对象的引用次数都是2。函数执行完成之后,objA和objB还将会继续存在,因为他们的引用次数永远不会是0。这样的相互引用如果说很大量的存在就会导致大量的内存泄露。
2.标记清除
- 从全局作用域的变量,沿作用域逐层往里深度遍历,当发现被引用,打上标记,执行完毕,将没有被标记的变量内存,进行销毁。
- 缺点:造成内存空间碎片化,频繁回收对象后,内存中就会存在大量不连续空间,称为内存碎片,如果需要分配较大的连续内存时,就会出现内存不足的情况
4.BOM与DOM对象是用引用计数的方式回收垃圾
5.弱引用WeakMap和WeakSet
6.常见内存泄漏的原因:
(1)全局变量引起的内存泄露
(2)闭包引起的内存泄露:慎用闭包
(3)dom清空或删除时,事件未清除导致的内存泄漏
(4)定时器未清除造成的内存泄漏
(5)循环引用带来的内存泄漏