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 相关文章推荐
静态的动态续篇之来点XML
Dec 23 Javascript
jquery插件制作 表单验证实现代码
Aug 17 Javascript
js 判断checkbox是否选中的操作方法
Nov 09 Javascript
THREE.JS入门教程(5)你应当知道的十件事
Jan 24 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
BootStrap实现轮播图效果(收藏)
Dec 30 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
May 24 Javascript
使用react render props实现倒计时的示例代码
Dec 06 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
Mar 13 Javascript
JS计算斐波拉切代码实例
Sep 12 Javascript
解决vant的Toast组件时提示not defined的问题
Nov 11 Javascript
vue+spring boot实现校验码功能
May 27 Vue.js
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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
PHP 第一节 php简介
2012/04/28 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
jQuery表单验证之密码确认
2017/05/22 jQuery
jquery加载单文件vue组件的方法
2017/06/20 jQuery
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
2019/03/06 Javascript
vue.js实现照片放大功能
2020/06/23 Javascript
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
python回调函数的使用方法
2014/01/23 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python类定义和类继承详解
2015/05/08 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
python实现图书借阅系统
2019/02/20 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
详解小白之KMP算法及python实现
2019/04/04 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
python利用platform模块获取系统信息
2020/10/09 Python
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
导游词之茶卡盐湖
2019/11/26 职场文书