浅谈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中剪贴板兼容性、判断复制成功或失败
Mar 09 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
Nov 24 Javascript
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
Jan 18 Javascript
使用AngularJS处理单选框和复选框的简单方法
Jun 19 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
window.location.reload 刷新使用分析(去对话框)
Nov 11 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 Javascript
Kindeditor单独调用多图上传实例
Jul 31 Javascript
JavaScript的setter与getter方法
Nov 29 Javascript
javascript将json格式数组下载为excel表格的方法
Dec 22 Javascript
JS实现简单tab选项卡切换
Oct 25 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生成缩略图的代码
2011/01/12 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
Python获取脚本所在目录的正确方法
2014/04/15 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
采购求职信
2014/03/17 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
学生检讨书怎么写
2014/10/09 职场文书
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js