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 相关文章推荐
Track Image Loading效果代码分析
Aug 13 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
Mar 04 Javascript
jQuery validate 中文API 附validate.js中文api手册
Jul 31 Javascript
JS模拟面向对象全解(二、类型与赋值)
Jul 13 Javascript
jquery easyui 结合jsp简单展现table数据示例
Apr 18 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
微信小程序 wxapp导航 navigator详解
Oct 31 Javascript
深入理解jquery中的each用法
Dec 14 Javascript
简单实现js倒计时功能
Feb 13 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
Jan 28 Javascript
详解vue 图片上传功能
Apr 30 Javascript
前端深入理解Typescript泛型概念
Mar 09 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操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
web.py在模板中输出美元符号的方法
2014/08/26 Python
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
Python自动调用IE打开某个网站的方法
2015/06/03 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
法学毕业生自我鉴定
2014/01/31 职场文书
法人代表任命书范本
2014/06/05 职场文书
求职简历自我评价2015
2015/03/10 职场文书
工程合作意向书范本
2015/05/09 职场文书