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 相关文章推荐
JavaScript获取/更改文本框的值的实例代码
Aug 02 Javascript
js中继承的几种用法总结(apply,call,prototype)
Dec 26 Javascript
node.js实现多图片上传实例
Jun 03 Javascript
node.js中使用node-schedule实现定时任务实例
Jun 03 Javascript
用jquery模仿的a的title属性的例子
Oct 22 Javascript
Javascript获取表单名称(name)的方法
Apr 02 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
Aug 06 Javascript
JS实现的论坛Ajax打分效果完整实例
Oct 31 Javascript
window.open打开窗口被拦截的快速解决方法
Aug 04 Javascript
jQuery插件artDialog.js使用与关闭方法示例
Oct 09 jQuery
JS 使用 window对象的print方法实现分页打印功能
May 16 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 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 版本]
2007/03/20 PHP
php IP及IP段进行访问限制的代码
2008/12/17 PHP
javascript 小型动画组件与实现代码
2010/06/02 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
php实现httpRequest的方法
2015/03/13 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
python3.0 字典key排序
2008/12/24 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
python装饰器使用实例详解
2019/12/14 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
房屋委托书范本
2014/04/04 职场文书
邀请函的格式
2015/01/30 职场文书
关于国庆节的广播稿
2015/08/19 职场文书