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 相关文章推荐
JavaScript 高级篇之闭包、模拟类,继承(五)
Apr 07 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
Nov 13 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
javascript自定义in_array()函数实现方法
Aug 03 Javascript
javascript中对变量类型的判断方法
Aug 09 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
Sep 19 Javascript
Vue 2中ref属性的使用方法及注意事项
Jun 12 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
Jun 21 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
Vue的土著指令和自定义指令实例详解
Feb 04 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
Sep 27 Javascript
微信小程序实现带放大效果的轮播图
May 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获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
详解python单例模式与metaclass
2016/01/15 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
领班岗位职责范文
2014/02/06 职场文书
公司节能减排方案
2014/05/16 职场文书
销售口号大全
2014/06/11 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
婚礼父母答谢词
2015/01/04 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS