垃圾回收机制与内存泄漏

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)循环引用带来的内存泄漏

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容