内存泄露和javaScript的内存管理机制

1.内存泄漏(Memory Leak)
是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
2.javaScript的内存管理机制
内存基元在变量(对象,字符串等等)创建时分配,然后在他们不再被使用时“自动”释放,后者被称为垃圾回收(GC:Garbage Collecation)
3.垃圾回收方法
1.标记清除Mark-and-sweep(大部分浏览器垃圾回收机制)
当变量进入执行环境(函数中声明变量)的时候,垃圾回收器将其标记为“进入环境”,
当变量离开环境的时候(函数执行结束)将其标记为“离开环境
原理:
当变量进入执行环境(函数中声明变量)的时候,垃圾回收器将其标记为“进入环境”,
当变量离开环境的时候(函数执行结束)将其标记为“离开环境

2.引用计数(低版本IE(IE6-8) BOM与DOM(com)对象是通过引用计数回收垃圾的 IE7-8的XMLHttpRequest对象)
跟踪一个值的引用次数,当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量指向其他一个值时该值的引用次数便减一。
当该值引用次数为0时就会被回收(这里次数计算是指堆内存中的值,被引用次数的加减)

该方式会引起内存泄漏的原因是不能解决循环引用的问题
function test(){
var a={};
var b={};
a.prop=b;
b.prop=a;
}
4.常见的内存泄露
1.意外的全局变量
解决:严格模式或使用是尽量避免
明确需要定义的全局变量怎么办?
给全局变量缓存的容量规定一个上界,如果过大就在使用过后将它设置为 null 或者将它重新赋值
2.被遗漏的定时器和回调函数
清除
3.dom循环引用
低版本IE(IE6-8) BOM与DOM(com)对象、 IE7-8的XMLHttpRequest对象
BOM和DOM中的对象就是使用C++以COM(Component Object Model)对象的形式实现的,而COM对象的垃圾收集机制采用的就是引用计数策略
function outerFunction(){ var ele= document.getElementById("element"); ele.onclick = function (){} } 解决(释放引用):ele = null;

【内存泄露和javaScript的内存管理机制】
4.闭包
function f(){ var n = 0; return function(){ return n++; ; } } var f1 = f(); 解决(使用之后释放引用): f1=null


    推荐阅读