浅谈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 相关文章推荐
Jquery cookie操作代码
Mar 14 Javascript
JavaScript全排列的六种算法 具体实现
Jun 29 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
js触发select onchange事件的小技巧
Aug 05 Javascript
node.js中的console.info方法使用说明
Dec 09 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
Extjs实现下拉菜单效果
Apr 01 Javascript
基于jQuery插件实现点击小图显示大图效果
May 11 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
Dec 22 Javascript
搭建element-ui的Vue前端工程操作实例
Feb 23 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
Nov 01 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
PHP 数组入门教程小结
2009/05/20 PHP
php简单实现快速排序的方法
2015/04/04 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
Jquery iframe内部出滚动条
2010/02/11 Javascript
javscript对象原型的一些看法
2010/09/19 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
python检查URL是否正常访问的小技巧
2017/02/25 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
对python中的for循环和range内置函数详解
2018/04/17 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
Django实现文件上传下载功能
2019/10/06 Python
python enumerate内置函数用法总结
2020/01/07 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
收集的7个CSS3代码生成工具
2010/04/17 HTML / CSS
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
我们的节日中秋活动方案
2014/08/19 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
MySQL数据库简介与基本操作
2022/05/30 MySQL