什么是javascript内存泄漏?以及解决方法

简介: 内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。简单理解:无用的内存还在占用,得不到释放和归还,比较严重的时候,无用的内存还会增加,从而导致整个系统卡顿,甚至崩溃

一、什么是javascript内存泄漏?

内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

简单理解:无用的内存还在占用,得不到释放和归还,比较严重的时候,无用的内存还会增加,从而导致整个系统卡顿,甚至崩溃

二、常见的内存泄漏

1.意外的全局变量(通常是变量未被定义或者胡乱引用了全局变量)

例如:

这里我们给函数中一个未声明的变量b赋值,这时就会使b成为一个全局变量

function a(){
    b=10;
}
a()
console.log(window);

这里的window打印出来就是

0ee42034717a4514a3a8c17c5ed8c25d.png

这样就会创建一个多余的全局变量,当执行完a函数之后,变量b仍然会存在于全局对象中,这就会造成内存泄漏


解决方法:

我们可以通过使用严格模式“use strict”来避免这一切。在JavaScript文件的开头,它将开启更严格的JavaScript解析模式,从而防止意外的创建全局变量,开启严格模式之后,程序就会报错b没有定义

296bd22389c04581aa98b7c07ea7ed42.png

注意:

需要特别注意那些用于临时存储和处理大量信息的全局变量。如果必须使用全局变量存储数据,就使用全局变量存储数据,但在不再使用时,就手动将其设置为

null,或者在处理完后重新分配。否则的话,请尽可能的使用局部变量。

2.计时器

例如:

setInterval("内存泄漏 ", 1000);

1.setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏

4aceef8fd76f4564b9a1b55ca71b0dd8.png

2.启动循环定时器后不清理

var intervalId = setInterval(function () {
  console.log( '内存泄漏')
}, 1000)

7cfc5689021f44f1a9068c3a2a902783.png

它会一直循环下去


解决方法:

使用cLearInterval清理计时器

const intervalId = setInterval(function () {
    console.log('内存泄漏')
}, 1000)
clearInterval(intervalId)

3.闭包

例如:

在fn1创建的内部函数fn2是不会回收的,因为它被全局变量f引用, 处于一个随时被调用的状态,所以会造成内存泄漏

function fn1() {
    var a = 4
    function fn2() {
        console.log(++a)
    }
    return fn2
}
var f = fn1()
f()

解决方法:

在执行完成之后设置为null

function fn1() {
    var a = 4
    function fn2() {
        console.log(++a)
    }
    return fn2
}
var f = fn1()
f()
f = null

4.事件监听未被移除

例如:

function addEvent (){
 const node =  document.getElementById('warp');
    node.addEventListener('touchmove',()=>{
        console.log('In Move');
    })
}
const onTouchEnd = (){
   const node =  document.getElementById('warp');
   node.
}
useEffect(()=>()=>{
     const node =  document.getElementById('warp');
     node.removeEventListener('touchmove');
}) // 类似react 生命周期函数: componentWillUnmount
render(<div id='warp' onTouchEnd={onTouchEnd}>
 // code...
</div>)

5.console.log

因为console.log的对象是不能被垃圾回收的

console.log("123");

6.缓存

建议所有缓存都设置好过期时间,如果缓存过多的话也会造成内存泄漏

相关文章
|
30天前
|
存储 缓存 JavaScript
请描述一种JavaScript内存泄漏的情况,并说明如何避免这种情况的发生。
JavaScript内存泄漏常由闭包引起,导致无用对象滞留内存,影响性能。例如,当一个函数返回访问大型对象的闭包,即使函数执行完,对象仍被闭包引用,无法被垃圾回收。防止泄漏需及时解除引用,注意事件监听器清理,使用WeakMap或WeakSet,定期清理缓存,以及利用性能分析工具检测。
13 2
|
1月前
|
JavaScript 前端开发 Java
springboot从控制器请求至页面时js失效的解决方法
springboot从控制器请求至页面时js失效的解决方法
15 0
springboot从控制器请求至页面时js失效的解决方法
|
1月前
|
Java 程序员 C++
深入探讨内存泄漏的原因及解决方法
深入探讨内存泄漏的原因及解决方法
|
3月前
|
存储 缓存 JavaScript
如何避免 JavaScript 中的内存泄漏?
如何避免 JavaScript 中的内存泄漏?
|
3月前
|
Web App开发 存储 JavaScript
【JavaScript】垃圾回收与内存泄漏
JavaScript的*垃圾回收机制*是一种自动化的内存管理机制,用于检测和回收不再使用的内存资源,以便重新分配给其他需要的部分。JavaScript中的垃圾回收器负责跟踪和管理内存的分配和释放,使开发人员无需手动管理内存。 *内存泄漏*指的是程序中分配的内存空间无法被释放和回收,并且随着时间推移导致可用内存逐渐减少。
53 0
|
1月前
|
JavaScript 前端开发
springboot+layui从控制器请求至页面时js失效的解决方法
springboot+layui从控制器请求至页面时js失效的解决方法
16 0
|
3月前
|
Web App开发 前端开发 JavaScript
JavaScript 内存泄漏的检测与防范:让你的程序更稳定
JavaScript 内存泄漏的检测与防范:让你的程序更稳定
JavaScript 内存泄漏的检测与防范:让你的程序更稳定
|
3月前
|
JavaScript 前端开发 Java
说说javascript内存泄漏的几种情况?
JavaScript内存泄漏是指应用程序中的内存不再被使用,但没有被正确释放,导致内存占用不断增加,最终可能导致应用程序性能下降或崩溃。
14 0
|
3月前
|
存储 JavaScript 前端开发
JavaScript知识总结 终结篇--面向对象,垃圾回收与内存泄漏
JavaScript知识总结 终结篇--面向对象,垃圾回收与内存泄漏
|
4月前
|
存储 JavaScript 前端开发
JavaScript 中内存泄漏的几种情况?
JavaScript 中内存泄漏的几种情况?
32 0