浅谈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 相关文章推荐
学习ExtJS form布局
Oct 08 Javascript
Jquery 高亮显示文本中重要的关键字
Dec 24 Javascript
js获得鼠标的坐标值的方法
Mar 13 Javascript
jQuery.event兼容各浏览器的event详细解析
Dec 18 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
Jul 18 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
Aug 10 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
jQuery EasyUI window窗口使用实例代码
Dec 25 jQuery
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
Aug 22 Javascript
JavaScript中的执行环境和作用域链
Sep 04 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 checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
php 抽象类的简单应用
2011/09/06 PHP
php实现把数组按指定的个数分隔
2014/02/17 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
angular.bind使用心得
2015/10/26 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
python中关于for循环的碎碎念
2017/06/30 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
Python实现FM算法解析
2019/06/18 Python
python conda操作方法
2019/09/11 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
护士自我推荐信范文
2015/03/24 职场文书
会计做账心得体会
2016/01/22 职场文书
子女赡养老人协议书
2016/03/23 职场文书
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL