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 相关文章推荐
js Form.elements[i]的使用实例
Nov 13 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
May 16 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
Jan 16 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
Feb 05 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
Aug 21 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
vue.js中mint-ui框架的使用方法
May 12 Javascript
js中apply()和call()的区别与用法实例分析
Aug 14 Javascript
浅谈Angular7 项目开发总结
Dec 19 Javascript
ES6学习笔记之let与const用法实例分析
Jan 22 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自定义函数格式化json数据示例
2016/09/14 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
实例讲解React 组件
2020/07/07 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
python3学习之Splash的安装与实例教程
2018/07/09 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
python多线程和多进程关系详解
2020/12/14 Python
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
史上最全面的Java面试题汇总!
2015/02/03 面试题
简单英文演讲稿
2014/01/01 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
售后求职信范文
2014/03/15 职场文书
小学生评语大全
2014/04/18 职场文书
庆元旦活动总结
2014/07/09 职场文书
会计师事务所实习证明
2014/11/16 职场文书
通讯稿范文
2015/07/22 职场文书
学校隐患排查制度
2015/08/05 职场文书