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 相关文章推荐
点击隐藏页面左栏或右栏实现js代码
Apr 01 Javascript
javascript:void(0)使用探讨
Aug 27 Javascript
关于JS数组追加数组采用push.apply的问题
Jun 09 Javascript
详解Javacript和AngularJS中的Promises
Feb 09 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
Sep 06 Javascript
JavaScript中省略元素对数组长度的影响
Oct 26 Javascript
js获取时间函数及扩展函数的方法
Oct 30 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
jquery中绑定事件的异同
Feb 28 Javascript
基于JS实现仿百度百家主页的轮播图效果
Mar 06 Javascript
js实现提交前对列表数据的增删改查
Jan 16 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标签云的实现代码
2012/10/10 PHP
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
9种改善AngularJS性能的方法
2017/11/28 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
Python KMeans聚类问题分析
2018/02/23 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
商务日语毕业生自荐信范文
2013/11/14 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
行政前台岗位职责
2015/04/16 职场文书
初中体育教学随笔
2015/08/15 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
倡议书怎么写?
2019/04/11 职场文书
自荐信范文
2019/05/20 职场文书
分享7个 Python 实战项目练习
2022/03/03 Python
MySQL查询日期时间
2022/05/15 MySQL