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 相关文章推荐
用 Javascript 验证表单(form)中的单选(radio)值
Sep 08 Javascript
jquery遍历checkbox介绍
Feb 21 Javascript
JS对文本框值的判断示例
Mar 10 Javascript
jQuery验证表单格式的使用方法
Jan 10 Javascript
详解vue-cli官方脚手架配置
Jul 20 Javascript
JS立即执行函数功能与用法分析
Jan 15 Javascript
在vue项目中引入highcharts图表的方法
Jan 21 Javascript
js实现一个简易计算器
Mar 30 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
Oct 31 Javascript
JavaScript经典案例之简易计算器
Aug 24 Javascript
Nuxt的路由动画效果案例
Nov 06 Javascript
如何让vue长列表快速加载
Mar 29 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内置函数config_load用法实例
2015/01/22 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
浅谈php调用python文件
2019/03/29 PHP
JavaScript 基础问答三
2008/12/03 Javascript
javascript 常用代码技巧大收集
2009/02/25 Javascript
给Function做的OOP扩展
2009/05/07 Javascript
基于jquery的loading效果实现代码
2010/11/05 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python实现在线音乐播放器
2017/03/03 Python
django定期执行任务(实例讲解)
2017/11/03 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
django列表筛选功能的实现代码
2020/03/27 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
python中K-means算法基础知识点
2021/01/25 Python
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
搞笑婚礼主持词
2014/03/13 职场文书
超市开店计划书
2014/04/26 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
医生见习报告范文
2014/11/03 职场文书
新生入学欢迎词
2015/01/26 职场文书
律师函格式范本
2015/05/27 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
利用 JavaScript 构建命令行应用
2021/11/17 Javascript