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全局中)出发触及到的对象被标记为不再使用,稍后进行回收。

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64168.shtml

张贴在3