浅谈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 无提示关闭浏览器页面的代码
Mar 09 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
Apr 17 Javascript
setTimeout和setInterval的深入理解
Nov 08 Javascript
JavaScript通过字符串调用函数的实现方法
Mar 18 Javascript
有关Promises异步问题详解
Nov 13 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
Dec 01 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
Aug 29 Javascript
详解JS中的快速排序与冒泡
Jan 10 Javascript
Angular开发者指南之入门介绍
Mar 05 Javascript
vue-quill-editor实现图片上传功能
Aug 08 Javascript
vue 开发一个按钮组件的示例代码
Mar 27 Javascript
jQuery实现推拉门效果
Oct 19 jQuery
简单三步实现报表页面集成天气
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
虫族 Zerg 历史背景
2020/03/14 星际争霸
关于PHP实现异步操作的研究
2013/02/03 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
JS中的多态实例详解
2017/10/15 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
举例讲解Python中装饰器的用法
2015/04/27 Python
20行python代码实现人脸识别
2019/05/05 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
原料仓管员岗位职责
2015/04/01 职场文书
贷款收入证明范本
2015/06/12 职场文书
2019财务转正述职报告
2019/06/27 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python