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保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 Javascript
a标签的href与onclick事件的区别详解
Nov 12 Javascript
一张Web前端的思维导图分享
Jul 03 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
Aug 21 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 Javascript
原生Javascript插件开发实践
Jan 09 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
Jan 23 Javascript
利用Node.js批量抓取高清妹子图片实例教程
Aug 02 Javascript
详解在Javascript中进行面向切面编程
Apr 28 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
Jun 04 jQuery
微信头像地址失效踩坑记附带解决方案
Sep 23 Javascript
JS创建或填充任意长度数组的小技巧汇总
Oct 24 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设计模式 Bridge (桥接模式)
2011/06/26 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
jquery中实现标签切换效果的代码
2011/03/01 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
node网页分段渲染详解
2016/09/05 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
Python版名片管理系统
2018/11/30 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
城市轨道专业个人求职信范文
2013/09/23 职场文书
团代会主持词
2014/04/02 职场文书
伊索寓言教学反思
2014/05/01 职场文书
反邪教标语
2014/06/23 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
无房证明范本
2014/09/17 职场文书
毕业证代领委托书
2014/09/26 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书