javascript 内存回收机制理解


Posted in Javascript onJanuary 17, 2011

1.唠叨
javascript语言是一门优秀的脚本语言.其中包含脚本语言的灵活性外还拥有许多高级语言的特性.例如充许构建和实例化一个对象,垃圾回收机制(GC:Garbage Collecation).通常我们使用new创建对象,GC负责回收对象占用内存区域.因此了解GC,可以加深对javascript垃圾回收机制的理解。
2.用局部变量和全局变量解释GC
GC在回收内存时,首先会判断该对象是否被其它对象引用.在确定没有其它对象引用便释放该对象内存区域.因此如何确定对象不再被引用是GC的关键所在.

<script> 
function aa(){ 
this.rr = "弹窗"; 
} 
function bb(){ 
this.rr = "弹窗"; 
} 
var b1; 
function cc(){ 
var a1 = new aa(); 
b1 = new bb(); 
return b1; 
} 
cc(); 
alert(b1.rr) 
</script>

如上代码中,执行完cc()后a1被回收了,此后我们可以通过b1.rr弹出文字窗口.在一些基础书籍中解释为:a1为局部变量,b1是全局变量.局部变量执行完后会被GC回收.但不全是这样,如下代码:
<script> 
function aa(){ 
this.rr = "弹窗"; 
} 
function bb(){ 
this.rr = "弹窗"; 
} 
function cc(){ 
var a1 = new aa(); 
var b1 = new bb(); 
return b1; 
} 
var b1 = cc(); 
alert(b1.rr); 
</script>

此时cc函数中的 a1,b1都是局部变量,但仍然会弹出文字窗口.说明b1并没有被GC回收.因此javascript中局部变量不是所有时候都被GC回收的.
3.抽象理解GC
GC回收机制还需要近一步了解。在此时引入几个概念:双向链表,作用域链,活动对象(为了方便理解,简化了原文的概念[http://softbbs.pconline.com.cn/9497825.html]) , 其中双向链表描述复杂对象的上下层级关系. 作用域链与活动对象分别是双向链表中的某个节点.以函数cc为例变量层级关系为:
window<=>cc<=>a1<=>rr
<=>b1<=>rr
(原文有详细解释)在执行cc()方法时,内存中变量的引用关系如上图,文字解释如下:
window的活动对象包括cc,假设window是顶级对象(因为运行中不会被回收)
cc的活动对象包括a1和b1,其作用域链是window
a1的活动对象包括rr,其作用域链是cc
b1的活动对象包括rr,其作用域链是cc
执行cc()时,cc的执行环境会创建一个活动对象和一个作用域链.其局部变量a1,b1都会挂在cc的活动对象中.当cc()执行完毕后,执行环境会尝试回收活动对象占用的内存.但因局部变量b1 通过return b1,为其增加了一条作用域链:window<=>b1<=>rr,所以GC停止对b1回收.
因此如果想将一个局部变量/函数提升为全局的,为其增加一条作用域链就OK了。
同时控制好对象的作用域链也变得重要了.因作用域链会意外导致GC无法回收目标对象.例如:
<SCRIPT LANGUAGE="JavaScript"> 
<!-- 
//猫 
function cat(name){ 
var zhuren ; 
this.name = name; 
//设置主人 
this.addZhuRen = function(zr){ 
zhuren = zr; 
} 
this.getZhuRen = function(){ 
return zhuren; 
} 
} 
//主人 
function zhuren(name){ 
this.name = name; 
} 
//创建主人: 
var zr = new zhuren("zhangsan"); 
//创建猫 
var cat1 = new cat("asan"); 
//设置该猫的主人 
cat1.addZhuRen(zr); 
//释放主人 
zr = null ; 
//此处还存在对主人对象的引用 
alert(cat1.getZhuRen().name) 
//--> 
</SCRIPT>
Javascript 相关文章推荐
window.onload 加载完毕的问题及解决方案(上)
Jul 09 Javascript
JavaScript 页面坐标相关知识整理
Jan 09 Javascript
javascript 得到变量类型的函数
May 19 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
Jun 18 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
Nov 04 Javascript
js数组与字符串常用方法总结
Jan 13 Javascript
源码分析Vue.js的监听实现教程
Apr 23 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
vue移动端使用canvas签名的实现
Jan 15 Javascript
详解Vue的sync修饰符
May 15 Vue.js
javascript 延迟加载技术(lazyload)简单实现
Jan 17 #Javascript
关于COOKIE个数与大小的问题
Jan 17 #Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
Jan 17 #Javascript
Jquery 插件开发笔记整理
Jan 17 #Javascript
JQuery学习笔记 nt-child的使用
Jan 17 #Javascript
Jquery知识点三 jquery表单对象操作
Jan 17 #Javascript
基于jquery的返回顶部效果(兼容IE6)
Jan 17 #Javascript
You might like
用PHP中的 == 运算符进行字符串比较
2006/11/26 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python解析基于xml格式的日志文件
2017/02/25 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
实习生自荐信范文
2013/11/13 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书