内存泄漏: 是指不再用的内存没有被及时释放出来,导致该段内存无法被使用称作为“内存泄漏”。
原因: 在我们无法通过js访问某个对象,而垃圾回收机制却认为该对象仍在被引用,因此垃圾回收机制不会释放该对象,导致该块内存永远无法释放,积少成多,最终 系统会越来越卡以至奔溃。
垃圾回收机制策略有
标记清除法
和引用计数法
两种。
标记清除法
垃圾回收机制获取根并标记它们,再访问并标记所有来自它们的引用,然后再访问这些对象并标记它们的引用,如此递进结束后,如果发现有没有被标记的(不可达的)进行删除,进入执行环境的不能被删除。工作流程:
- 垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记;
- 去掉环境中的变量以及被环境中的变量引用的变量的标记;
- 被加上标记的会被视为准备删除的变量;
- 垃圾回收器完成内存清理工作,销毁那些带标记的值并回收它们所占用的内存空间。
引用计数法
当声明一个变量并给该变量赋值一个引用类型的值得时候,该值计数+1;
当该值赋值给另外一个变量时,该值计数+1;
当该值被其它值取代时,该值计数-1;当计数的值变为0时,说明无法访问该值,垃圾回收机制清除该对象。
工作流程:- 声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数就是1;
- 同一个值又被赋值给另一个变量,这个引用类型值的引用次数加1;
- 当包含这个引用类型值的变量又被赋值成另一个值了,那么这个引用类型值的引用次数减1;
- 当引用次数变成0时,说明没办法访问这个值了;
- 当垃圾收集器下一次运行时,它就会释放引用次数是0的值所占的内存。
但是循环引用的时候就会释放不掉内存——造成内存泄漏.
解决: 手工断开JS对象和DOM之间的链接,赋值为null。IE9把DOM和BOM转换成真正的JS对象了,所以避免了这个问题。