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简化Ajax开发 Ajax开发入门
Oct 14 Javascript
js bind 函数 使用闭包保存执行上下文
Dec 26 Javascript
深入分析Javascript跨域问题
Apr 17 Javascript
纯javascript移动优先的幻灯片效果
Nov 02 Javascript
js实现正则匹配中文标点符号的方法
Dec 23 Javascript
js+css绘制颜色动态变化的圈中圈效果
Jan 27 Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 Javascript
jQuery Ztree行政地区树状展示(点击加载)
Nov 09 Javascript
DOM 事件的深入浅出(二)
Dec 05 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
Mar 20 jQuery
node解析修改nginx配置文件操作实例分析
Nov 06 Javascript
Javascript confirm多种使用方法解析
Sep 25 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
长波知识介绍
2021/03/01 无线电
拼音码表的生成
2006/10/09 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
ThinkPHP分页实例
2014/10/15 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
Python 多维List创建的问题小结
2019/01/18 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
animation和transition的区别
2020/10/12 HTML / CSS
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
应届大学生自荐信
2013/12/05 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
春节晚会开场白
2015/05/29 职场文书
python基础之停用词过滤详解
2021/04/21 Python
详解PHP Swoole与TCP三次握手
2021/05/27 PHP