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 相关文章推荐
input、button的不同type值在ajax提交表单时导致的陷阱
Feb 24 Javascript
基于jquery的direction图片渐变动画效果
May 24 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
Nov 01 Javascript
javascript数组的使用
Mar 28 Javascript
js实现select组件的选择输入过滤代码
Oct 14 Javascript
JScript中的条件注释详解
Apr 24 Javascript
深入剖析JavaScript:Object类型
May 10 Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 Javascript
js实现动态显示时间效果
Mar 06 Javascript
详解使用angular的HttpClient搭配rxjs
Sep 01 Javascript
浅谈vue2 单页面如何设置网页title
Nov 08 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 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 download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
jQuery插件开发全解析
2012/10/10 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
用实例解释Python中的继承和多态的概念
2015/04/27 Python
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
详解Python3定时器任务代码
2019/09/23 Python
Python list运算操作代码实例解析
2020/01/20 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
研究生自荐信
2013/10/09 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
工地安全检查制度
2014/02/04 职场文书
营销学习心得体会
2014/09/12 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
Golang jwt身份认证
2022/04/20 Golang