浅谈JavaScript的自动垃圾收集机制


Posted in Javascript onDecember 15, 2016

执行环境会负责管理代码执行过程中使用的内存,编写JavaScript程序时,所需内存的分配以及无用内存的回收完全实现自动管理。

原理:

找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性地执行这一操作。

垃圾收集的方式:

1.标记清除(mark-and-sweep)

最常用的垃圾收集方式。当变量进入环境时,就将变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。当变量离开环境时,则将其标记为“离开环境”。

立即收集器在运行时会给存储在内存中的所有变量都加上标记,然后它会去掉环境中的变量以及被环境中的变量引用的变量的标记。剩下的在被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量。最后,垃圾收集器完成内存清除,销毁那些带有标记的值并收回它们所占用的内存空间。

2.引用计数(reference counting)

跟踪记录每个值被引用的次数,当这个值的引用次数为0时,说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。当垃圾收集器下次再运行时,会释放那些引用次数为零的值所占用的内存。

(1)应用机制存在一个问题:循环引用。

循环引用是指对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的引用。(这样它们的引用可能永远不为0,如果函数被重复多次调用,就会导致大量的内存得不到回收。)

(2)IE中的BOM和DOM中的对象使用C++以COM(component Object Model,组件对象模型)对象的形式实现,而COM对象的垃圾收集机制采用的是引用计数策略。

以下是COM对象导致的循环引用的问题:

eg:

var element=document.getElementById("some_element");
 var myObject=new Object();
 myObject.element=element;
 element.someObject=myObject;

上面的例子在一个DOM元素(element)和一个原生JavaScript对象(myObject)之间创建了循环引用。由于存在这个循环引用,即使将例子中的DOM从页面移除,它也永远不会被回收。

可以使用以下代码手工断开原生JavaScript和DOM元素之间的链接:

myObject.element=null;
element.someObject=null;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js函数调用常用方法详解
Dec 03 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
Aug 12 Javascript
基于jquery实现的仿优酷图片轮播特效代码
Jan 13 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
Feb 02 Javascript
jQuery Dialog 取消右上角删除按钮事件
Sep 07 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
Oct 24 Javascript
JS实现颜色梯度与渐变效果完整实例
Dec 30 Javascript
Vue 表单控件绑定的实现示例
Aug 11 Javascript
详谈commonjs模块与es6模块的区别
Oct 18 Javascript
JavaScript实现修改伪类样式
Nov 27 Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 Javascript
JavaScript实现多层颜色选项卡嵌套
Sep 21 Javascript
简单三步实现报表页面集成天气
Dec 15 #Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 #Javascript
JavaScript中定义对象原型的两种使用方法
Dec 15 #Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
Dec 15 #Javascript
javascript数组去重方法分析
Dec 15 #Javascript
JS碰撞运动实现方法详解
Dec 15 #Javascript
浅述节点的创建及常见功能的实现
Dec 15 #Javascript
You might like
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
PHP sleep()函数, usleep()函数
2016/08/25 PHP
php的socket编程详解
2016/11/20 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
javascript 闭包疑问
2010/12/30 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
Python OS模块常用函数说明
2015/05/23 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Python for循环生成列表的实例
2018/06/15 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
Python函数中的可变长参数详解
2019/09/12 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
暑期实习鉴定
2013/12/16 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
小学生寒假家长评语
2014/04/16 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
学习保证书怎么写
2015/02/26 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书