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使用手册之 事件处理
Mar 24 Javascript
javascript 数组排序函数
Aug 20 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
Dec 07 Javascript
jquery ui resizable bug解决方法
Oct 26 Javascript
简短几句 通俗解释javascript的闭包
Jan 17 Javascript
浅谈Javascript中深复制
Dec 01 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
Jul 05 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
JavaScript 2018 中即将迎来的新功能
Sep 21 Javascript
IE9 elementUI文件上传的问题解决
Oct 17 Javascript
vue-cli3搭建项目的详细步骤
Dec 05 Javascript
基于iview的router常用控制方式
May 30 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新手上路(八)
2006/10/09 PHP
dedecms模版制作使用方法
2007/04/03 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
bootstrap table小案例
2016/10/21 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
Python与shell的3种交互方式介绍
2015/04/11 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
学校司机岗位职责
2013/11/14 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
结对共建工作方案
2014/06/02 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
单方投资意向书
2015/05/11 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
晚会开幕词范文
2016/03/04 职场文书
尝试使用Python爬取城市租房信息
2022/04/12 Python