Javascript具有自动拉圾收集机制,即执行环境会负责管理代码执行过程中使用的内存。这种垃圾收集的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性地执行这一操作。那么如何判断一个变量不再被使用,有两种机制。
1.标记清除
Javascript中最常用的垃圾收集方式是标记清除(mark-and-sweep)。当变量进入环境时(如在函数中声明一个变量),就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当亦是离开环境时,则将其标记为“离开环境”。
可以采用任何方式标记变量。比如,可以通过翻转某个特殊的位来记录一个变量何时进入环境,或者使用一个“进入环境的”变量列表及一个“离开环境的”变量列表来跟踪哪个变量发生了变化。
垃圾收集器在运行的时候会给存储在内存中的所有变量及被环境中的变量引用的变量的标记。而在此后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这此变量了。最后,垃圾收集器完成内存清除的工作,销毁那些带标记的值并回收它们所占用的内存。
目前,IE,FF,Chrome,Safari,Opera的Javascript实现使用的都是标记清除式的垃圾收集策略,只不过垃圾收集的时间间隔互有不同。
2.引用计数
另一种不太常见的垃圾收集策略是引用计数 (reference counting)。引用计数的含义是跟踪记录每个值被引用的的次数。当声明了一个变量并将一个引用类型值赋给一个该变量时,则这个值的引用次数是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,若包含对这个值引用的变量又取得了另外一个值,则这个值的引用的次数减1。当这个值的引用次数变为0,则说明没有办法再访问该变量了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次运行时,它就会释放那些引用次数为0的值所点用的内存。不过,该策略存在一个严重的问题:循环引用。循环引用指的是A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的引用。
function problem() {
var A = new Object();
var B = new Object();
A.someOtherObject = B;
B.anotherObject = A;
}
当采用引用计数策略的实现时,当函数执行完毕后,A和B还将继续存在,因为它们的引用次数永远不会是0.假如多次调用该函数,就会导致大量内存得不到回收。
IE中有一部分对象并不是原生的Javascript对象,如其中DOM,BOM中的对象就是使用C++以COM对象的形式实现的,而COM对象垃圾收集机制采用的是引用计数策略。故只要IE中涉及COM对象,就会存在循环引用问题。如下:
var el = document.getElementById('id');
var myObject = new Object();
myObject.el = el;
el.someObject = myObject;
为避免类似这样的循环引用问题,最好是在不使用它们的时候手工断开原生Javascript对象与DOM元素之间的连接。如下:
myObject.el= null;
el.someObject = null;
为解决上面的问题,IE9+把BOM和DOM对象都转换成了真正的Javascript对象。这样就避免了常见的内存泄漏问题。
分享到:
相关推荐
JavaScript经典代码收集,个人收集的经典常用的JavaScript代码
javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存。在编写javascript程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。下面将详细介绍...
提示信息收集的Javascript定义信息
Javascript 垃圾收集机制介绍理解,需要的朋友可以参考一下
一文带你了解JavaScript垃圾回收机制 目录 1. 概述 2. 内存管理 3. 垃圾回收 4. GC算法介绍 5. 引用计数算法 1. 引用计数优缺点 6. 标记清除算法 1. 标记清除算法优缺点 7. 标记整理算法 8. 执行时机 9. V8引擎 1...
详解JavaScript的垃圾回收机制 目录 为什么需要垃圾回收(GC)什么是垃圾回收垃圾产生垃圾回收策略引用计数标记循环引用引发的问题解决方法引用计数算法的优缺点标记清除算法核心思想标记清除算法优缺点标记整理...
JavaScript技巧收集,这是是从网上搜集的,都是实用的技巧!
javascript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中的使用的内存。而在C和C++之类的语言中,开发人员的一项基本任务就是手动跟踪内存的使用情况,这是造成许多问题的一个根源。在编写...
JavaScript代码收集
javascript资料收集
JavaScript技巧收集.7z
javascript脚本收集贴,基本网页验证类的都有了。
当时我学JavaScript用的资料 感觉很使用 就共享了 希望可以帮助你学好JavaScript
javascript技巧精心收集
网页常用Javascript经典代码收集
WEB_javascript资料收集.pdf