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管中窥豹 形参与实参浅析
Dec 17 Javascript
JS随即打乱数组实现代码
Dec 03 Javascript
公共js在页面底部加载的注意事项介绍
Jul 18 Javascript
JS正则验证邮箱的格式详细介绍
Nov 19 Javascript
改变隐藏的input中value的值代码
Dec 30 Javascript
屏蔽相应键盘按钮操作
Mar 10 Javascript
JavaScript类型系统之正则表达式
Jan 05 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
Jun 28 Javascript
javascript表单正则应用
Feb 04 Javascript
vue服务端渲染缓存应用详解
Sep 12 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 Javascript
uni-app之APP和小程序微信授权方法
May 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
事件绑定之小测试  onclick &amp;&amp; addEventListener
2011/07/31 Javascript
jQuery 获取兄弟元素的几种不错方法
2014/05/23 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
2018/10/30 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
python模块之re正则表达式详解
2017/02/03 Python
Python 多进程和数据传递的理解
2017/10/09 Python
Python实现的计数排序算法示例
2017/11/29 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
建筑施工员岗位职责
2013/11/26 职场文书
工程专业毕业生自荐信范文
2013/12/25 职场文书
小学开学寄语
2014/01/19 职场文书
关于期中考试的反思
2014/02/02 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers