浅谈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 相关文章推荐
JavaScript多线程的实现方法
May 08 Javascript
Jquery练习之表单验证实现代码
Dec 14 Javascript
jquery foreach使用示例
Sep 12 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
Jun 30 Javascript
js实现文字跟随鼠标移动而移动的方法
Feb 28 Javascript
可以浮动某个物体的jquery控件用法实例
Jul 24 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
谈谈JavaScript数组常用方法总结
Jan 24 Javascript
vue中本地静态图片路径写法
Mar 06 Javascript
使用layui 渲染table数据表格的实例代码
Aug 19 Javascript
webpack4 SCSS提取和懒加载的示例
Sep 03 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
Mar 26 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
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
package.json文件配置详解
2017/06/15 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
如何实现vue的tree组件
2020/12/03 Vue.js
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
倩碧美国官网:Clinique美国
2016/07/20 全球购物
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
药学专业毕业生求职信
2013/10/20 职场文书
小学生成长感言
2014/01/30 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
员工手册董事长致辞
2015/07/29 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android