黑马程序员技术交流社区

标题: js垃圾回收机制之引用计数及循环引用 [打印本页]

作者: sangwentao    时间: 2016-6-21 19:29
标题: js垃圾回收机制之引用计数及循环引用
【含猜测】
js引用计数机制主要关注对象,一个对象若被引用的次数>0。则不能被回收。若引用次数=0。则应被回收。引用次数计数方法如下:
若其地址被赋给一个变量,则该对象引用次数++;若引用该对象的变量取得其它值则该对象引用次数--;
当该对象被创建时引用次数++(因为有一个引用)。当某个引用该对象的变量退出其环境时,该变量被销毁,则对象引用次数--;

循环引用由于处于循环中的每个对象都需要其它对象销毁才能使它的引用次数归零。因此,每个对象都无法归零引用次数。比如:A的一个对象属性引用B,B的一个对象属性引用A。则只有当B销毁,A的引用次数才能归零,同理只有A销毁B的引用次数才能归零。因此AB皆废。

循环引用导致内存泄露的一个例子:
function assignHandler(){
    var element = document.getElementById('div');
    element.onclick = function(){
        alert(element.id);
    };
}
上面的函数创建了一个div元素和其函数onclick之间的循环引用。值得注意的是函数闭包会引用包含它的函数的整个活动对象。因此有必要把element指空。element指空实际是去除了函数对元素的引用。
正确的方式:
function assignHandler(){
    var element = document.getElementById('div');
    var id = element.id;
    element.onclick = function(){
        alert(id);
    };

    element = null;
}

闭包应该是另一套机制,返回的函数若引用外层函数的某个变量,则外层函数内所有变量常驻内存,直到返回的函数引用次数归零。
作者: doushengwei    时间: 2016-6-21 23:30
引用计数常用来说明垃圾收集的工作方式,但似乎从未被应用与任何一种Java虚拟机中实现
作者: doushengwei    时间: 2016-6-21 23:32
作为一种回收算法,引用计数法记录着每一个对象被其它对象所持有的引用数。如果一个对象的引用计数为零,那么该对象就变成了所谓的不可达对象,亦即可以被回收的。  当一个对象被回收后,被该对象所引用的其它对象的引用计数都应该相应减少。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2