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

  • 一、什么是javascript内存泄漏?
  • 二、常见的内存泄漏
    • 1.意外的全局变量(通常是变量未被定义或者胡乱引用了全局变量)
    • 2.计时器
    • 3.闭包
    • 4.事件监听未被移除
    • 5.console.log
    • 6.缓存

一、什么是javascript内存泄漏?

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

二、常见的内存泄漏

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

例如:

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

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

这里的window打印出来就是


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

解决方法:

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

注意:

需要特别注意那些用于临时存储和处理大量信息的全局变量。如果必须使用全局变量存储数据,就使用全局变量存储数据,但在不再使用时,就手动将其设置为
null,或者在处理完后重新分配。否则的话,请尽可能的使用局部变量。

2.计时器

例如:

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

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

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

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


它会一直循环下去

解决方法:

使用cLearInterval清理计时器

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

3.闭包

例如:

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

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

解决方法:

在执行完成之后设置为null

function fn1() {var a = 4function 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.缓存

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

什么是javascript内存泄漏?以及解决方法相关推荐

  1. ionic3生产打包javascript内存溢出的解决方法

    ionic3生产打包javascript内存溢出的解决方法 参考文章: (1)ionic3生产打包javascript内存溢出的解决方法 (2)https://www.cnblogs.com/wei- ...

  2. Android 常见内存泄漏及解决方法

    Android中的内存泄漏: 先说一下为什么会出现内存泄漏: Android程序开发中,如果一个对象已经不需要被使用了,本该被回收时,而这时另一个对象还在持有对该对象的引用,这样就会导致无法被GC回收 ...

  3. Android之内存泄漏以及解决办法(持更)

    Android之内存泄漏以及解决办法 文章链接:http://blog.csdn.net/qq_16628781/article/details/67761590 知识点: 单例造成的内存泄漏原因和解 ...

  4. python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法

    Python内存泄漏和内存溢出的解决方法 发布时间:2020-10-30 23:08:34 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关Python内存泄漏和内存溢出的解决方 ...

  5. c语言int超出范围字符串,Go返回int64类型字段超出javascript Number范围的解决方法...

    Go返回int64类型字段超出javascript Number范围的解决方法 最近在项目中,一个go服务给前端提供了一个接口,返回json格式数据,其中Int64字段会超出javascript Nu ...

  6. C# Winform应用程序占用内存较大解决方法整理(转)-- SetProcessWorkingSetSize

    一.C# Winform应用程序占用内存较大解决方法整理(转) 原文:  http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在 ...

  7. 使用 Android Studio 检测内存泄漏与解决内存泄漏问题

    本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...

  8. linux内存泄漏通用排查方法

    一.   概述 Linux下经常遇到内存泄漏的问题,尤其对C/C++开发人员来说是一个亘古不变的话题,现在介绍解决Linux内存泄漏问题的方法层出不穷,让人眼花缭乱,但是作为开发人员应该从本质上了解为 ...

  9. Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法

    本篇文章主要介绍了Android性能优化之利用LeakCanary检测内存泄漏及解决办法,有兴趣的同学可以了解一下. 目录 前言 什么是内存泄漏? 内存泄漏造成什么影响? 什么是LeakCanary? ...

最新文章

  1. K项目轶事之开工第一天
  2. C++ 覆盖方法、重载方法的理解
  3. RDD, DataFrame or Dataset
  4. nginx和apache的伪静态区别
  5. .NET Core迁移前的准备工作
  6. 纯净版VS2015安装教程(适合初次安装或者重装系统后)
  7. python组合的语法_在Python中使用语法sugar-to-function组合是个好主意吗?
  8. java电信计费项目_基于jsp的电信计费-JavaEE实现电信计费 - java项目源码
  9. python爬取哔哩哔哩视频_python爬取哔哩哔哩小视频
  10. 计算机基础2008版第7次作业,中医药大学-计算机基础2008版-1-7次作业.doc
  11. leaflet 设置地图上某个标注位于页面最上层
  12. 计算机管理员工作目标任务书,毕业论文任务书中主要任务及目标怎么写
  13. 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
  14. RTK固定解什么意思
  15. setContentView(R.layout.main)在Android里面,这句话是什么意思?
  16. 计算机维修耗材管理,中国建设银行驻马店分行计算机耗材管理办法.doc
  17. 杭州记忆 | 科达为G20做的三件事
  18. 文案女王彭芳如何转变为“百万发售系统”创始人?我们来探个究竟!
  19. 计算机毕业设计Node.js+Express郑州市智慧农贸市场管理系统(源码+程序+lw+远程调试)
  20. opencv学习(四十三)之图像的矩moments()

热门文章

  1. HTML5新增的9种常用的页面标签
  2. 浅谈php输出数组的4种方法
  3. 孔维滢 20171010110《面向对象程序设计(java)》第十周学习总结
  4. Learning to Adapt Invariance in Memory for Person Re-identification文章阅读解析及代码理解
  5. Makefile---(origin variable)详解
  6. 毕业三年跳槽八次,换来惨痛的后果,资深架构师给出的一些建议!
  7. 实现div滚动条默认在最底部
  8. 好佳居软装十大品牌 软装你了解多少
  9. 【面试】Spring框架面试题
  10. Java日志门面技术 SLF4J