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 相关文章推荐
dojo学习第二天 ajax异步请求之绑定列表
Aug 29 Javascript
基于jquery实现的省市区级联无ajax
Sep 24 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
JQuery select(下拉框)操作方法汇总
Apr 15 Javascript
javascript删除数组重复元素的方法汇总
Jun 24 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
Dec 03 Javascript
浅谈angular懒加载的一些坑
Aug 20 Javascript
使用JQuery选择HTML遍历函数的方法
Sep 17 Javascript
js实现5秒倒计时重新发送短信功能
Feb 05 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
JavaScript链式调用实例浅析
Dec 19 Javascript
Vue实现按钮级权限方案
Nov 21 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
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
Vuex提升学习篇
2018/01/11 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
python实现代码行数统计示例分享
2014/02/10 Python
python制作最美应用的爬虫
2015/10/28 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
Python 正则表达式爬虫使用案例解析
2019/09/23 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
俄罗斯商务邀请函
2014/01/26 职场文书
董事长助理岗位职责
2014/02/18 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
个人安全承诺书
2014/05/22 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书