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 showModelDialog的使用方法示例详解
Nov 19 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
Oct 09 Javascript
jQuery对象与DOM对象之间的相互转换
Mar 03 Javascript
AngularJS模块管理问题的非常规处理方法
Apr 29 Javascript
深入理解js promise chain
May 05 Javascript
Angular2 (RC5) 路由与导航详解
Sep 21 Javascript
sea.js常用的api简易文档
Nov 15 Javascript
vue cli 3.x 项目部署到 github pages的方法
Apr 17 Javascript
layui lay-verify form表单自定义验证规则详解
Sep 18 Javascript
JS实现商品橱窗特效
Jan 09 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 jQuery
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 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
支付宝接口开发集成支付环境小结
2015/03/17 PHP
php的debug相关函数用法示例
2016/07/11 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
个人实用简单的自我评价
2013/10/19 职场文书
自主实习接收函
2014/01/13 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
让生命充满爱观后感
2015/06/08 职场文书
赞助商致辞
2015/07/30 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
python垃圾回收机制原理分析
2022/04/13 Python