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中通过过滤器获取表单元素的实现代码
Jul 05 Javascript
JS获取页面input控件中所有text控件并追加样式属性
Feb 25 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
Apr 12 Javascript
jQuery表单验证功能实例
Aug 28 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
Oct 04 Javascript
CSS或者JS实现鼠标悬停显示另一元素
Jan 22 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
Jun 13 Javascript
Node.js + Redis Sorted Set实现任务队列
Sep 19 Javascript
jQuery完成表单验证的实例代码(纯代码)
Sep 30 jQuery
webpack4.x打包过程详解
Jul 18 Javascript
当vue路由变化时,改变导航栏的样式方法
Aug 22 Javascript
浅谈redux, koa, express 中间件实现对比解析
May 23 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
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
Javascript this指针
2009/07/30 Javascript
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
浅谈js中的this问题
2017/08/31 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
Python日志模块logging简介
2015/04/13 Python
Python Web框架Tornado运行和部署
2020/10/19 Python
python安装Scrapy图文教程
2017/08/14 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Pandas的数据过滤实现
2021/01/15 Python
html5弹跳球示例代码
2013/07/23 HTML / CSS
社区端午节活动方案
2014/01/28 职场文书
《社戏》教学反思
2014/04/15 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
校运会通讯稿
2015/07/18 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
golang中的struct操作
2021/11/11 Golang
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技