浅谈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 相关文章推荐
jQuery 中关于CSS操作部分使用说明
Jun 10 Javascript
JavaScript中判断函数是new还是()调用的区别说明
Apr 07 Javascript
jquery图片放大镜功能的实例代码
Mar 26 Javascript
用js实现小球的自由移动代码
Apr 22 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 Javascript
JavaScript极简入门教程(二):对象和函数
Oct 25 Javascript
js实现点击每个li节点,都弹出其文本值及修改
Dec 15 Javascript
React-Native之定时器Timer的实现代码
Oct 04 Javascript
webpack手动配置React开发环境的步骤
Jul 02 Javascript
微信小程序实现底部导航
Nov 05 Javascript
微信小程序身份证验证方法实现详解
Jun 28 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 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的伪静态模式
2015/12/31 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python unittest实现api自动化测试
2018/04/04 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
行政管理人员精品工作推荐信
2013/11/04 职场文书
员工工作表扬信范文
2014/01/13 职场文书
教师节促销活动方案
2014/02/14 职场文书
中秋寄语大全
2014/04/11 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
MySQL数据库如何给表设置约束详解
2022/03/13 MySQL
Nebula Graph解决风控业务实践
2022/03/31 MySQL