浅谈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 极速 隐藏/显示万行表格列只需 60毫秒
Mar 28 Javascript
Javascript对象属性方法汇总
Nov 21 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
Dec 16 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
Jun 06 Javascript
jquery删除table当前行的实例代码
Oct 07 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 Javascript
Vue.js项目模板搭建图文教程
Sep 20 Javascript
Angular实现预加载延迟模块的示例
Oct 12 Javascript
js定时器实现倒计时效果
Nov 05 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
Feb 15 Javascript
vuex存储token示例
Nov 11 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/03/02 日漫
php通过字符串调用函数示例
2014/03/02 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
微信小程序背景音乐开发详解
2019/12/12 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
Python的词法分析与语法分析
2013/05/18 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
Python遍历目录的4种方法实例介绍
2015/04/13 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
2019/08/22 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
P/Invoke是什么
2015/07/31 面试题
书法培训心得体会
2014/01/05 职场文书
《乌塔》教学反思
2014/02/17 职场文书
王老吉广告词
2014/03/20 职场文书
公司职员入党自传书
2015/06/26 职场文书