JavaScript 的内存泄露和垃圾回收
什么是内存泄露 ?
-
任何编程语言,在运行时都需要使用到内存,比如在一个函数中, var arr = [1, 2, 3, 4, 5]; 这么一个数组,就需要内存。
-
但是,在使用了这些内存之后, 如果后面他们不会再被用到,但是还没有及时释放,这就叫做内存泄露(memory leak)。如果出现了内存泄露,那么有可能使得内存越来越大,而导致浏览器崩溃。
-
C语言是通过手动分配和释放内存的, 如通过malloc分配,通过free释放,这种方式是比较麻烦的。而java、c#、js等是为了解放程序员的负担,提出了程序自动释放内存,这种方式就是垃圾回收机制。
JavaScript 中的两种 垃圾回收机制
引用计数
即跟踪记录每个值被引用的次数,当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1; 相反,如果包含对这个值引用的变量又取得了另外一个值,那么这个值的引用次数就减1;当引用次数变为0的时候,则说明没有办法再访问到这个值了,所以,就可以把其所占用的内存空间给收回来。 这样,垃圾收集器下次再运行时,他就会释放哪些引用次数为0的值所占的内存。
DEMO:
function
test(){
var a = {} ; //a的引用次数为0
var b = a ; //a的引用次数加1,为1
var c =a; //a的引用次数再加1,为2
var b ={}; //a的引用次数减1,为1
}
复制代码
标记清除
这是JavaScript中最常用的垃圾回收机制。当变量进入环境时,就标记这个变量为“进入环境”,逻辑上说,永远不能释放进入环境的变量所占用的内存,因为一旦进入环境就有可能随时用到他们,当变量离开环境的时候,将其标记为“离开环境”。
DEMO:
function
test(){
var a = 10 ;
//被标记 ,进入环境
var b = 20 ;
//被标记 ,进入环境
}
test(); //执行完毕 之后 a、b又被标离开环境,被回收。
复制代码
什么时候触发 垃圾回收
ie
垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。IE6的垃圾回收是根据内存分配量运行的,当环境中存在256个变量、4096个对象、64k的字符串任意一种情况的时候就会触发垃圾回收器工作,看起来很科学,不用按一段时间就调用一次,有时候会没必要,这样按需调用不是很好吗?但是如果环境中就是有这么多变量等一直存在,现在脚本如此复杂,很正常,那么结果就是垃圾回收器一直在工作,这样浏览器就没法儿玩儿了。
微软在IE7中做了调整,触发条件不再是固定的,而是动态修改的,初始值和IE6相同,如果垃圾回收器回收的内存分配量低于程序占用内存的15%,说明大部分内存不可被回收,设的垃圾回收触发条件过于敏感,这时候把临街条件翻倍,如果回收的内存高于85%,说明大部分内存早就该清理了,这时候把触发条件置回。这样就使垃圾回收工作职能了很多
合理的 GC 方案
1)、Javascript引擎基础GC方案是(simple GC):mark and sweep(标记清除),即:
(1)遍历所有可访问的对象。
(2)回收已不可访问的对象。
作者:leoeo
链接:https://juejin.im/post/5a77fdf7f265da4e732ea741
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章
- JavaScript 箭头函数与普通函数
- ExtJS学习-----------Ext.Object,ExtJS对javascript中的Object的扩展
- 在JavaScript开发中,关于var、let和const你需要知道这些
- 原生 javascript 基础回顾
- uni-app - 将 base64 图片编码转为 Blob 本地文件路径(把base64类型的图片,转换成blob二进制文件流)适用于 uni-app / vue.js / JavaScript
- javascript之DOM技术(二)
- javascript实现java的map对象,js实现new map()
- JavaScript 执行上下文与作用域
- 16期-熬夜7天,我总结了JavaScript与ES的25个重要知识点!
- JavaScript设计模式-工厂模式
- 一篇文章带你了解JavaScript中的变量,作用域和内存问题
- 《JavaScript面向对象编程指南》——2.8 本章小结
- 《网站建设与网页设计从入门到精通Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript》——3.3 添加文本元素
- 《网站建设与网页设计从入门到精通Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript》——3.5 设置头信息
- 《JavaScript设计与开发新思维》——2.2 HTML5入门
- javascript innerHTML 大数据量加载 导致IE 内存溢出 的解决办法
- Javascript IE 内存释放
- 详细分析 javascript 的内存分配
- JavaScript中的Array对象方法调用
- Jquery第四课 Javascript中this的使用方法
- 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP