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检测客户端不是firefox则提示下载
Apr 07 Javascript
可自己添加html的伪弹出框实现代码
Sep 08 Javascript
ListBox实现上移,下移,左移,右移的简单实例
Feb 13 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
jQuery代码实现发展历程时间轴特效
Jul 30 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
Aug 17 Javascript
js图片上传前预览功能(兼容所有浏览器)
Aug 24 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
Nov 01 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
Node.js的特点详解
Feb 03 Javascript
Layui Table js 模拟选中checkbox的例子
Sep 03 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
Oct 20 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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
php产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
使用Python更换外网IP的方法
2018/07/09 Python
Python中的heapq模块源码详析
2019/01/08 Python
在Python中表示一个对象的方法
2019/06/25 Python
Python实现快速排序的方法详解
2019/10/25 Python
python随机数分布random均匀分布实例
2019/11/27 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
你的自行车健身专家:FaFit24
2016/11/16 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
员工年终演讲稿
2014/01/03 职场文书
学校大课间活动方案
2014/01/30 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS