JS常见内存泄漏及解决方案解析


Posted in Javascript onMay 30, 2020

内存泄漏?

官方解释:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

通俗点就是指由于疏忽或者错误造成程序未能释放已经不再使用的内存,不再用到的内存却没有及时释放,从而造成内存上的浪费。

避免内存泄漏?

在局部作用域中,等函数执行完毕,变量就没有存在的必要了,垃圾回收机制很亏地做出判断并且回收,但是对于全局变量,很难判断什么时候不用这些变量,无法正常回收;所以,尽量少使用全局变量。在使用闭包的时候,就会造成严重的内存泄漏,因为闭包中的局部变量,会一直保存在内存中。

内存溢出?

当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误。
例如下面的代码,谨慎试用,可能会卡窗口。。。。

var obj = {}
for (var i = 0; i < 100000; i++) {
obj[i] = new Array(10000000)
}
console.log('------')

常见的js内存泄漏

1. 意外的全局变量

在js中,一个未声明变量的使用,会在全局对象中创建一个新的变量;在浏览器环境下,全局对象就是window:

function foo() {
a = 'test'
}
// 上面的写法等价于
function foo() {
window.a = 'test'
}
function foo() {
this.a = 'test'
// 函数自身发生调用,this指向全局对象window
}
foo();

上面的a变量应该是foo()内部作用域变量的引用,由于没有使用var来声明这个变量,这时变量a就被创建成了全局变量,这个就是错误的,会导致内存泄漏。

解决方式: 在js文件开头添加 ‘use strict',开启严格模式。(或者一般将使用过后的全局变量设置为 null 或者将它重新赋值,这个会涉及的缓存的问题,需要注意)

<script> 
"use strict"; 
console.log("这是严格模式。"); 
</script> 
<script> 
 console.log("这是正常模式。"); 
</script>

2. 计时器和回调函数timers

定时器setInterval或者setTimeout在不需要使用的时候,没有被clear,导致定时器的回调函数及其内部依赖的变量都不能被回收,这就会造成内存泄漏。

解决方式:当不需要interval或者timeout的时候,调用clearInterval或者clearTimeout

3. DOM泄漏

1)给DOM对象添加的属性是一个对象的引用

var a = {};
document.getElementById('id').diyProp = a;

解决方法:在window.onload时间中加上 document.getElementById('id').diyProp = null;

2)元素引用没有清理

var a = document.getElementById('id');
document.body.removeChild(a);
// 不能回收,因为存在变量a对它的引用。虽然我们用removeChild移除了,但是还在对象里保存着#的引用,即DOM元素还在内存里面。

解决方法: a = null;

3)事件的绑定没有移除

解决方法: 移除时间的监听

4. js闭包

闭包在IE6下会造成内存泄漏,但是现在已经无须考虑了。值得注意的是闭包本身不会造成内存泄漏,但闭包过多很容易导致内存泄漏。闭包会造成对象引用的生命周期脱离当前函数的上下文,如果闭包如果使用不当,可以导致环形引用(circular reference),类似于死锁,只能避免,无法发生之后解决,即使有垃圾回收也还是会内存泄露。

这个,另外找个时间详细说明一下,这里就不赘述了

5. console

控制台日志记录对总体内存内置文件的影响,也是个重大的问题,同时也是容易被忽略的。记录错误的对象,可以将大量的数据保留在内存中。传递给console.log的对象是不能被垃圾回收,所以没有去掉console.log可能会存在内存泄漏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中关于new Object时传参的一些细节分析
Mar 13 Javascript
javascript利用apply和arguments复用方法
Nov 25 Javascript
JavaScript实现自动消除按钮功能的方法
Aug 05 Javascript
基于jQuery实现放大镜特效
Oct 19 Javascript
跨域请求的完美解决方法(JSONP, CORS)
Jun 12 Javascript
react.js 获取真实的DOM节点实例(必看)
Apr 17 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
Jun 23 jQuery
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
vue使用Font Awesome的方法步骤
Feb 26 Javascript
JS判断数组是否包含某元素实现方法汇总
Jun 24 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
Jan 29 jQuery
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 Javascript
react结合bootstrap实现评论功能
May 30 #Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
May 30 #jQuery
JavaScript类的继承多种实现方法
May 30 #Javascript
Vue实现购物车实例代码两则
May 30 #Javascript
vue实现购物车案例
May 30 #Javascript
vue.js实现简单购物车功能
May 30 #Javascript
vue实现简单学生信息管理
May 30 #Javascript
You might like
遭遇php的in_array低性能问题
2013/09/17 PHP
php实现webservice实例
2014/11/06 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
JS排序之选择排序详解
2017/04/08 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
Python中的作用域规则详解
2015/01/30 Python
python实现从字典中删除元素的方法
2015/05/04 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
Python面向对象封装操作案例详解
2019/12/31 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
Python加速程序运行的方法
2020/07/29 Python
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
护理学专业推荐信
2013/12/03 职场文书
《荷花》教学反思
2014/04/16 职场文书
企业文明单位申报材料
2014/05/16 职场文书
股东授权委托书范文
2014/09/13 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL