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 相关文章推荐
js报错 Object doesn't support this property or method的原因分析
Mar 31 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
Apr 23 Javascript
jQuery控制Div拖拽效果完整实例分析
Apr 15 Javascript
Vue.js实战之组件之间的数据传递
Apr 01 Javascript
微信小程序 支付功能(前端)的实现
May 24 Javascript
vue实现nav导航栏的方法
Dec 13 Javascript
angular 组件通信的几种实现方式
Jul 13 Javascript
vue2过滤器模糊查询方法
Sep 16 Javascript
详解如何提升JSON.stringify()的性能
Jun 12 Javascript
JavaScript中的连续赋值问题实例分析
Jul 12 Javascript
微信小程序列表时间戳转换实现过程解析
Oct 12 Javascript
vue切换菜单取消未完成接口请求的案例
Nov 13 Javascript
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的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
Python多线程编程(五):死锁的形成
2015/04/05 Python
Python生成器(Generator)详解
2015/04/13 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
邓小平理论心得体会
2014/09/09 职场文书
安全先进个人材料
2014/12/29 职场文书
2015感人爱情寄语
2015/02/26 职场文书
通用员工手册范本
2015/05/14 职场文书
感谢师恩主题班会
2015/08/17 职场文书
话题作文之学会尊重
2019/12/16 职场文书