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 相关文章推荐
jQuery 使用手册(一)
Sep 23 Javascript
javascript 验证日期的函数
Mar 18 Javascript
JavaScript中的prototype使用说明
Apr 13 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
Dec 12 Javascript
js检测网络是否具体连接功能的代码
May 23 Javascript
jQuery异步获取json数据方法汇总
Dec 22 Javascript
json实现添加、遍历与删除属性的方法
Jun 17 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
Jul 24 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
Mar 17 Javascript
iview Upload组件多个文件上传的示例代码
Sep 30 Javascript
微信小程序wx.request拦截器使用详解
Jul 09 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新手上路(四)
2006/10/09 PHP
PHP strtr() 函数使用说明
2008/11/21 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
jQuery 阴影插件代码分享
2012/01/09 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
Linux常见面试题
2016/10/04 面试题
应征英语教师求职信
2013/11/27 职场文书
音乐教育感言
2014/03/05 职场文书
环保建议书500字
2014/05/14 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
乌镇导游词
2015/02/02 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
python引入其他文件夹下的py文件具体方法
2021/05/23 Python