您好,登录后才能下订单哦!
今天小编给大家分享一下JS中的内存泄漏与垃圾回收机制实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
JS中的内存泄漏是什么?
内存泄漏:就是用动态存储分配函数动态开辟的内存空间,使用完后没有及时回收,导致一直占据着内存单元,数量多了后就会造成内存泄漏
JS中的垃圾回收是什么?
垃圾回收机制,就是不定期的寻找到不再使用的变量,然后释放掉他们所指向的内存,防止内存泄漏
总结:垃圾回收虽然可以找到一些不再使用的局部变量回收,但是它无法对全局变量、Dom元素引用、闭包等进行回收处理,所以这也是导致内存泄漏的一个重要原因。
下面向大家介绍一下垃圾回收的两个算法:
一、引用计数
IE采用的引用计数算法, 定义了“内存不再使用”这个标准,当一个对象没有其它任何变量指向它的时候,就说明这个对象以及不再被使用了,此时会进行垃圾回收释放内存空间。举个例子:
// 创建一个对象person, person指向一块内存空间, 该内存空间的引用数 +1
let person = {
age: 22,
name: 'ifcode'
}
let p = person // 两个变量指向一块内存空间, 该内存空间的引用数为 2
person = 1 // 原来的person对象被赋值为1,对象内存空间的引用数-1,
// 但因为p指向原person对象,还剩一个对于对象空间的引用, 所以对象它不会被回收
p = null // 原person对象已经没有引用,会被回收
但是引用技术有一个致命的弊端就是:无法解决循环引用的问题。
如果两个对象相互引用,及时他们已经不再使用了,垃圾回收器也不会对他们进行处理,导致内存泄漏:
上图中对象o1与对象o2进行了循环引用,当代码执行完毕后,o1和o2未被引用就会释放掉,但是o1里面的a可以通过o1和o2.a同时访问到,此时就出现了循环引用的问题,虽然o1和o2两个对象被释放掉了,但对象里面的两个a还是互相引用的状态,浏览器会误以为这两块内存仍然被使用着,此时就造成了内存泄漏。
二、标记清除
上面讲到了因为引用技术有循环引用这个隐藏大bug,所以当下它已经不再被使用了,目前浏览器采用的垃圾回收算法是标记清除
标记清除法:将“不再使用大的对象”这个概念修改为“无法达到的对象”
就是说凡是从根部能到达的对象都还是使用的,那些无法由根部(JS全局中)出发触及到的对象被标记为不再使用,稍后进行回收。
以上就是“JS中的内存泄漏与垃圾回收机制实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。