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 相关文章推荐
JAVASCRIPT下判断IE与FF的比较简单的方式
Oct 17 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
Jan 07 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
Nov 17 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
Nov 19 Javascript
jQuery自带的一些常用方法总结
Sep 03 Javascript
原生js模拟淘宝购物车项目实战
Nov 18 Javascript
超简单的Vue.js环境搭建教程
Mar 17 Javascript
angular使用post、get向后台传参的问题实例
May 27 Javascript
深入了解javascript 数组的sort方法
Jun 01 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
Mar 06 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
May 13 Javascript
JavaScript位置参数实现原理及过程解析
Sep 14 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 header函数分析详解
2011/08/06 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
几行js代码实现自适应
2017/02/24 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
Python strip lstrip rstrip使用方法
2008/09/06 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
深入理解python函数递归和生成器
2016/06/06 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
Python random模块用法解析及简单示例
2017/12/18 Python
详解python深浅拷贝区别
2019/06/24 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
python名片管理系统开发
2020/06/18 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
一套VC试题
2015/01/23 面试题
彩色的非洲教学反思
2014/02/18 职场文书
《钱学森》听课反思
2014/03/01 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
社会工作专业自荐信
2014/09/26 职场文书
安全隐患整改报告
2014/11/06 职场文书
大学生个人学年总结
2015/02/15 职场文书
春节随笔
2015/08/15 职场文书
高二语文教学反思
2016/02/16 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python