什么是内存泄漏?

程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。

对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能:变慢,延迟大等 ,重则导致进程崩溃。

我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取。

不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。

内存泄漏的识别方法

1、使用快捷键 F12 或者 Ctrl+Shift+J 打开 Chrome 浏览器的「开发者工具」。

2、选择 Performance(老版为Timeline) 选项卡,在 Capture 选项中,只勾选 Memory。

3、设置完成后,点击最左边的 Record 按钮,然后就可以访问网页了。

4、打开一个网站,例如:www.taobao.com,当网页加载完成后,点击 Stop,等待分析结果。

5、然后在 ChartView 上寻找内存急速下降的部分,查看对应的 EventLog,可以从中找到 GC 的日志。

具体过程如下图所示:

内存泄露的常见原因及处理方式

常见原因:

1. 意外的全局变量

下面代码中变量bar在foo函数内,但是bar并没有声明.JS就会默认将它变为全局变量,这样在页面关闭之前都不会被释放.

function foo(){ bar=2 console.log('bar没有被声明!')}

b 没被声明,会变成一个全局变量,在页面关闭之前不会被释放.使用严格模式可以避免.

2. dom清空时,还存在引用

很多时候,为了方便存取,经常会将 DOM 结点暂时存储到数据结构中.但是在不需要该DOM节点时,忘记解除对它的引用,则会造成内存泄露.

var element = { shotCat: document.getElementById('shotCat')};document.body.removeChild(document.getElementById('shotCat'));// 如果element没有被回收,这里移除了 shotCat 节点也是没用的

与此类似情景还有: DOM 节点绑定了事件, 但是在移除的时候没有解除事件绑定,那么仅仅移除 DOM 节点也是没用的

3. 定时器中的内存泄漏

var someResource = getData();setInterval(function() { var node = document.getElementById('Node'); if(node) { node.innerHTML = JSON.stringify(someResource)); }}, 1000);

如果没有清除定时器,那么 someResource 就不会被释放,如果刚好它又占用了较大内存,就会引发性能问题. 但是 setTimeout ,它计时结束后它的回调里面引用的对象占用的内存是可以被回收的. 当然有些场景 setTimeout 的计时可能很长, 这样的情况下也是需要纳入考虑的.

4. 不规范地使用闭包

例如下面的例子: 相互循环引用.这是经常容易犯的错误,并且有时也不容易发现.

function foo() { var a = {}; function bar() { console.log(a); }; a.fn = bar; return bar; };

bar和a形成了相互循环引用.可能有人说bar里不使用console.log(a)不就没有引用了吗就不会造成内存泄露了.NONONO,bar作为一个闭包,即使它内部什么都没有,foo中的所有变量都还是隐式地被 bar所引用。 即使bar内什么都没有还是造成了循环引用,那真正的解决办法就是,不要将a.fn = bar.

避免策略:

  1. 减少不必要的全局变量,或者生命周期较长的对象,及时对无用的数据进行垃圾回收(即赋值为null);
  2. 注意程序逻辑,避免“死循环”之类的 ;
  3. 避免创建过多的对象 原则:不用了的东西要记得及时归还。
  4. 减少层级过多的引用

原文链接:https://mp.weixin.qq.com/s/umlEgXrKNdtrgHh58Mliig
作者:小生方勤

内存泄漏的原因及解决办法_浅谈 JS 内存泄漏问题相关推荐

  1. 内存泄漏的原因及解决办法_探索内存碎片化 - 第288篇

    相关历史文章(阅读本文之前,您可能需要先看下之前的系列 ) 色谈Java序列化:女孩子慎入 - 第280篇 烦不烦,别再问我时间复杂度了:这次不色,女孩子进来吧 - 第281篇 双向链表,比西天还远? ...

  2. 内存泄漏的原因及解决办法_编程基础 | C++片段 指针、多态和内存分配

    本片段将介绍运行期而不是编译期的内存分配 1.变量的内存分配和方法的前期绑定 函数中声明的局部变量与其参数以及簿记数据一起被放置在一个活动记录中.活动记录存储在名为运行期栈(run-time stac ...

  3. 内存泄漏的原因及解决办法_内存泄漏的场景和解决办法

    1.非静态内部类会持有外部类的引用,如果非静态内部类的实例是静态的,就会长期的维持着外部类的引用,组织被系统回收,解决办法是使用静态内部类 2.多线程相关的匿名内部类和非静态内部类 匿名内部类同样会持 ...

  4. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  5. 什么是内存泄漏,常见引起引起内存泄漏的原因,及解决办法

    一:什么是内存泄露 内存泄露是指:内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存 ...

  6. java面试-内存溢出的原因及解决办法

    内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存. 引起内存溢出的原因有很多种,常见的有以下几种: 1.内存中加载的数据量过于庞大,如一 ...

  7. redis 删除数据,但是占用内存没有下降原因及解决办法

    在使用 Redis 时,我们经常会遇到这样一个问题:明明做了数据删除,数据量已经不大了,为什么使用 top 命令查看时,还会发现 Redis 占用了很多内存呢? 实际上,这是因为,当数据删除后,Red ...

  8. linux内存管理_浅谈Linux内存管理

    1. 扫盲篇 1.1 操作系统存储层次 常见的计算机存储层次如下: 寄存器:CPU提供的,读写ns级别,容量字节级别. CPU缓存:CPU和CPU间的缓存,读写10ns级别,容量较大一些,百到千节. ...

  9. java内存模型浅析_浅谈java内存模型

    不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的.其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改.总结jav ...

最新文章

  1. 利用php比较精确的统计在线人数的办法
  2. 在单缓冲区和双缓冲区结构下,读入并分析完该文件的时间分别是
  3. IOS自带正则表达式NSPredicate的使用
  4. Chrome浏览器新功能 剪贴板多平台共享
  5. Safe Or Unsafe(hdu2527)哈弗曼VS优先队列
  6. 调用一个Activity并返回结果
  7. Seaborn绘制kdeplot和distplot
  8. 将React Native集成至Android原生应用
  9. 口罩预约管理系统——数据库设计(前端+PHP+MySQL)
  10. java餐饮系统需求总结,基于java的餐饮管理系统的设计与实现开题报告
  11. java下载天地图数据,天地图离线地图,可指定经纬度范围
  12. mate桌面美化 Linux,ubuntu mate 15.04桌面的美化
  13. CSDN的MD编辑器【写作技巧】
  14. Flash:一个TLF图文并貌的高级应用类
  15. 梦想近在眼前却遥不可及
  16. EMC测试中的电流探头
  17. Zeppelin Job monitor打开
  18. 小程序分包加载不同项目字体图标引用问题
  19. Canvas 画布中坐标系的位置问题(原点确定)
  20. win10出现错误代码0x80073712的解决办法

热门文章

  1. 如何最大化使用BI工具
  2. android迷宫源代码,迷宫 c++源代码(Maze c++ source code).doc
  3. tabbar角标 小程序_【沃行课堂】恭喜你遇到“坑”,小程序踩坑指南
  4. datagrid 什么时候结束编辑_小规模纳税人免税政策什么时候结束?有答复了
  5. armax函数 matlab 源码_【源码】Kmeans聚类算法(超快速、简洁的设计方法)
  6. php 取消命名空间,到PHP命名空间或不到PHP命名空间
  7. zookeeper启动后查看状态的Error contacting service. It is probably not running.错误
  8. python | 关键词快速匹配检索小工具 pyahocorasick / ahocorapy
  9. webpack4.0学习笔记
  10. Linux下7z工具安装