Javascript 垃圾收集机制介绍理解


Posted in Javascript onMay 14, 2013

经常使用 Javascript 的人会琢磨其垃圾收集机制,Javascript 并不像 C,C++ 那样需要开发者手动去清除垃圾,在编写 Javascript 程序是,开发者无需关心内存使用问题,所需内存分配以及无用内存(垃圾)的回收完全实现了自动管理。究其根源,主要是程序收集那些不再使用的变量,并且释放其占用的内存。因此,垃圾收集机制会按照固定时间间隔,周期性反复的执行这一操作。

举例来说,局部变量只存在于函数内部,程序会为局部变量在栈内存或堆内存中分配对应的存储空间,当函数运行结束,局部变量所占用的内存就没有存在的必要了,这时程序会释放局部变量所占用的内存供其他变量使用。这是程序最简单释放内存的方法,但是很多时候,程序中变量会一直被使用,此时垃圾收集机制必须跟踪变量并且判断其是否被使用,是否可以释放其内存空间。

垃圾收集机制主要判断变量释放内存空间的方法有两个:其一是标记清除法,其二是引用计数法。

标记法,每个变量都有其运行环境,变量创建后会在某种环境中运行,比如创建一个局部变量,局部变量会运行在函数体内。当函数运行时,会标记局部变量为“进入环境”,当函数体运行结束后,意味着变量脱离了其运行环境,此时则将变量标记为“离开环境”。对于“离开环境”的变量,垃圾收集机制会进行相应记录,并且在下一个回收周期时将其释放。

引用计数法,跟踪记录每个值的被引用次数。声明一个变量并将一个引用类型值赋给该变量时,这个值得引用次数就是 1。如果同一个值又被赋给另外一个变量,则该值的引用次数加 1。相反,如果包含对这个值的引用的变量又取得另外一个值,这个值得引用次数减 1。当这个值得引用次数为 0 时,则说明没有办法再访问到此值,因此就可以将其占用的内存空间回收。当垃圾收集器在下一个周期运行时,会释放引用次数为零的值所占用的内存空间。(原文解释参考:Javascript 高级程序设计 - 第二版)

举个例子来说:

            function countMethod(){
                  var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                  var object2 = new Object(); // 声明变量,计数器由 0 变为 1
                  object1.method1 = object2;  // object1 计数器 -1,object2 计数器 +1
                  object2.method2 = object1;  // object1 计数器 +1,object2 计数器 -1
            }

此函数运行退出后,object1 的计数器读数为 1,object2 的计数器度数为 1。所以两个变量都不会被销毁。如果大量的这样的程序存在于函数体内,就会导致大量的内存被浪费而无法回收,从而导致内存的泄露。

上述问题解决方法,手动释放 object1 object2 所占用的内存。即:

                 object1.method1 = null;
                 object2.method2 = null;

对比上面的例子,举一个正常情况下的例子。
            function countMethod(){
                  var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                  var object2 = new Object(); // 声明变量,计数器由 0 变为 1
                  object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
                  object2.method2 = "This is object2";  // object2 计数器 -1,object2 读数变为0
            }

通过上例看出,正常情况下,当函数运行结束后,object1 object2的读数均为 0,在下一个垃圾收集周期时,会被回收并且释放其所占用的内存。
Javascript 相关文章推荐
jQuery 处理表单元素的代码
Feb 15 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 Javascript
javascript将浮点数转换成整数的三个方法
Jun 23 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
Nov 03 Javascript
简单介绍JavaScript的变量和数据类型
Jun 03 Javascript
JavaScript中的时间处理小结
Feb 24 Javascript
js实现四舍五入完全保留两位小数的方法
Aug 02 Javascript
浅谈在koa2中实现页面渲染的全局数据
Oct 09 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
Vue安装浏览器开发工具的步骤详解
May 12 Javascript
Vue 中使用富文本编译器wangEditor3的方法
Sep 26 Javascript
vue通过接口直接下载java生成好的Excel表格案例
Oct 26 Javascript
JavaScript实现GriwView单列全选(自写代码)
May 13 #Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
May 13 #Javascript
js 程序执行与顺序实现详解
May 13 #Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
May 13 #Javascript
JS 加入收藏夹的代码(主流浏览器通用)
May 13 #Javascript
jQuery实现长文字部分显示代码
May 13 #Javascript
jq选项卡鼠标延迟的插件实例
May 13 #Javascript
You might like
PHP 柱状图实现代码
2009/12/04 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
php文件包含的几种方式总结
2019/09/19 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
js格式化时间的方法
2015/12/18 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
公司同意接收函
2014/01/13 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
中药专业自荐信范文
2014/03/18 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
最感人的道歉情书
2015/05/12 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书