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 相关文章推荐
详解jQuery插件开发中的extend方法
Nov 19 Javascript
js脚本实现数据去重
Nov 27 Javascript
javascript 常见功能汇总
Jun 11 Javascript
百度地图api如何使用
Aug 03 Javascript
整理Javascript基础语法学习笔记
Nov 29 Javascript
利用js判断手机是否安装某个app的多种方案
Feb 13 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 Javascript
微信小程序实现bindtap等事件传参
Apr 08 Javascript
小程序云开发之用户注册登录
May 18 Javascript
vue实现搜索过滤效果
May 28 Javascript
如何在postman中添加cookie信息步骤解析
Jun 30 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如何透过ODBC来存取数据库
2006/10/09 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
2013/04/13 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
简明json介绍
2008/09/28 Javascript
JavaScript 注册事件代码
2011/01/27 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
Python文件和目录操作详解
2015/02/08 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
HTML5的结构和语义(3):语义性的块级元素
2008/10/17 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
个人求职简历的自我评价范文
2013/10/09 职场文书
婚前协议书怎么写
2014/04/15 职场文书
职业规划实施方案
2014/06/10 职场文书
欢迎领导标语
2014/06/27 职场文书
推广普通话的宣传语
2015/07/13 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
微信小程序调用python模型
2022/04/21 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python