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 相关文章推荐
图片之间的切换
Jun 26 Javascript
jquery $.each()使用探讨
Sep 23 Javascript
基于jquery的9行js轻松实现tab控件示例
Oct 12 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
JavaScript获取XML数据附示例截图
Mar 05 Javascript
angularjs中的单元测试实例
Dec 06 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
May 03 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
Dec 21 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
Nov 11 Javascript
Angular使用Restful的增删改
Dec 28 Javascript
jQuery-App输入框实现实时搜索
Nov 19 jQuery
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实现memcache缓存示例讲解
2013/12/04 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
php微信公众号开发之简答题
2018/10/20 PHP
javascript作用域和闭包使用详解
2014/04/25 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
python定向爬取淘宝商品价格
2018/02/27 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
在Python中定义一个常量的方法
2018/11/10 Python
500行python代码实现飞机大战
2020/04/24 Python
CSS3中background-clip和background-origin的区别示例介绍
2014/03/10 HTML / CSS
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
ORACLE第二个十问
2013/12/14 面试题
给水工程专业毕业生自荐信
2014/01/28 职场文书
社区中秋节活动方案
2014/01/29 职场文书
物流毕业生个人的自我评价
2014/02/13 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
2014年终工作总结范本
2014/12/15 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
MySQL数据库完全卸载的方法
2022/03/03 MySQL
详解CSS3浏览器兼容
2022/12/24 HTML / CSS