JS常见内存泄漏及解决方案解析

 更新时间:2020年05月30日 11:58:23   作者:颉旺飞  
这篇文章主要介绍了JS常见内存泄漏及解决方案解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

内存泄漏?

官方解释:内存泄漏(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可能会存在内存泄漏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • js光标定位文本框回车表单提交问题的解决方法

    js光标定位文本框回车表单提交问题的解决方法

    这篇文章主要介绍了js光标定位文本框回车表单提交问题的解决方法,涉及javascript阻止浏览器默认事件的方法,需要的朋友可以参考下
    2015-05-05
  • 在JavaScript中获取请求的URL参数[正则]

    在JavaScript中获取请求的URL参数[正则]

    在ASP.NET后台代码中,对于这样的URL请求地址:http://www.abc.com?id=001,我们可以通过Request.QueryString["id"]的方法很容易的获取到URL中请求的参数的值,但是要在前台js代码中获取请求的参数的值,应该怎么做呢?
    2010-12-12
  • JavaScript中boolean类型之三种情景实例代码

    JavaScript中boolean类型之三种情景实例代码

    下面小编就为大家带来一篇JavaScript中boolean类型之三种情景实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 完美实现八种js焦点轮播图(上篇)

    完美实现八种js焦点轮播图(上篇)

    这篇文章主要介绍了完美实现八种js焦点轮播图的具体资料,基于完美运动框架move2.js而完成的八种焦点录播图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • JS算法教程之字符串去重与字符串反转

    JS算法教程之字符串去重与字符串反转

    这篇文章主要给大家介绍了关于JS算法教程之字符串去重与字符串反转的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • JavaScript实现表单全选或反选效果

    JavaScript实现表单全选或反选效果

    这篇文章主要为大家详细介绍了JavaScript实现表单全选或反选效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Javascript中级语法快速入手

    Javascript中级语法快速入手

    本文是一篇关于Javascript的中级进阶总结。小编希望大家能够在30分钟之内阅读完并认真体会,多敲代码,多总结,毕竟Javascript本身并不难。
    2016-07-07
  • js实现横向拖拽导航条功能

    js实现横向拖拽导航条功能

    本文主要介绍了js实现横向拖拽导航条功能的方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • JS取文本框中最小值的简单实例

    JS取文本框中最小值的简单实例

    这篇文章主要介绍了JS取文本框中最小值的简单实例,有需要的朋友可以参考一下
    2013-11-11
  • JS数组求和的几种常见方法总结

    JS数组求和的几种常见方法总结

    js的数组与我们日常生活中的数组一样,都是会进行求和计算的,下面这篇文章主要给大家介绍了关于JS数组求和的几种常见方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01

最新评论