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 document.images实例
May 27 Javascript
javascript 写类方式之五
Jul 05 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
Aug 17 Javascript
javascript中去除数组重复元素的实现方法【实例】
Apr 12 Javascript
jQuery遍历json的方法分析
Apr 16 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
May 31 Javascript
微信小程序实现页面跳转传值的方法
Oct 12 Javascript
JS同步、异步、延迟加载的方法
May 05 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
Nov 02 Javascript
详解vue移动端项目代码拆分记录
Mar 15 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
在antd Form表单中select设置初始值操作
Nov 02 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模板页面中分页代码的解析
2009/02/06 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
javascript 冒号 使用说明
2009/06/06 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
jquery下实现overlay遮罩层代码
2010/08/25 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
python地震数据可视化详解
2019/06/18 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
python标记语句块使用方法总结
2019/08/05 Python
Django的CVB实例详解
2020/02/10 Python
师范毕业生自荐信
2013/10/17 职场文书
物流专业大学应届生求职信
2013/11/03 职场文书
怎样客观的做好自我评价
2013/12/28 职场文书
岗位竞聘演讲稿范文
2014/04/24 职场文书
英文导游词
2015/02/13 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server