浅谈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学习笔记(十七)js 优化
Feb 04 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
Sep 19 Javascript
js this函数调用无需再次抓获id,name或标签名
Mar 03 Javascript
解决js下referer兼容各大浏览器的方法
Nov 03 Javascript
js查找节点的方法小结
Jan 13 Javascript
jQuery时间轴插件使用详解
Jul 16 Javascript
vue中的scope使用详解
Oct 29 Javascript
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
Apr 20 jQuery
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
如何在基于vue-cli的项目自定义打包环境
Nov 10 Javascript
vue实现单一筛选、删除筛选条件
Oct 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
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
2014/05/22 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
Vue header组件开发详解
2018/01/26 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
2018/09/14 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
Python Sleep休眠函数使用简单实例
2015/02/02 Python
Python pickle模块用法实例分析
2015/05/27 Python
python数据结构之图深度优先和广度优先实例详解
2015/07/08 Python
Python操作MongoDB详解及实例
2017/05/18 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
Python自定义线程池实现方法分析
2018/02/07 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
Python读取stdin方法实例
2019/05/24 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
美国网上订购鲜花:FTD
2016/09/23 全球购物
行政助理岗位职责
2013/11/10 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL