浅谈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函数验证总结(方便js客户端输入验证)
Oct 29 Javascript
wap图片滚动特效无css3元素纯js脚本编写
Aug 22 Javascript
JS判断客服QQ号在线还是离线状态的方法
Jan 13 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
Mar 26 Javascript
js中this用法实例详解
May 05 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
Jan 05 Javascript
js中创建对象的几种方式
Feb 05 Javascript
微信小程序实现YDUI的ScrollTab组件
Feb 02 Javascript
vue中slot(插槽)的介绍与使用
Nov 12 Javascript
elementUI select组件使用及注意事项详解
May 29 Javascript
js实现课堂随机点名系统
Nov 21 Javascript
Echarts.js无法引入问题解决方案
Oct 30 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扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
php生成短网址示例
2014/05/05 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
Python实现在线音乐播放器
2017/03/03 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
ubuntu上安装python的实例方法
2019/09/30 Python
零基础学python应该从哪里入手
2020/08/11 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
会计专业自荐信
2013/12/02 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
运动会入场式解说词
2014/02/18 职场文书
装修设计师求职信
2014/02/26 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
异地年检委托书范本
2014/09/24 职场文书
小学家长意见怎么写
2015/06/03 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
Python打包为exe详细教程
2021/05/18 Python
java泛型通配符详解
2021/07/25 Java/Android
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏