内存泄露是指:内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使
用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间
使用完毕之后未回收)即所谓内存泄漏。
哪些操作会造成内存泄漏?
1、垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的
引用数量为 0(没有其他对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象的
内存即可回收
2、setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
3、闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
内存泄漏的解决方式
       

1、global variables:对未声明的变量的引用在全局对象内创建一个新变量。在浏览器中,全
局对象就是 window。
function foo(arg) {bar = "some text";// 等同于 window.bar = 'some text';}
1.1)解决:
        1.1.1)创建意外的全局变量
   function foo() {this.var1 = "potential accident";}
        1.1.2)可以在 JavaScript 文件开头添加 “use strict”,使用严格模式。这样在严格模式 下解析 JavaScript 可以防止意外的全局变量
        1.1.3)在使用完之后,对其赋值为 null 或者重新分配
1.2)被忘记的 Timers 或者 callbacks  在 JavaScript 中使用 setInterval 非常常见 大多数库都会提供观察者或者其它工具来处理回调函数,在他们自己的实例变为不可达时, 会让回调函数也变为不可达的。对于 setInterval,下面这样的代码是非常常见的:
<script>var serverData = loadData();setInterval(function () {var renderer = document.getElementById("renderer");if (renderer) {renderer.innerHTML = JSON.stringify(serverData);}}, 5000); //This will be executed every ~5 seconds.
</script>
这个例子阐述着 timers 可能发生的情况:计时器会引用不再需要的节点或数据
1.3)闭包:一个可以访问外部(封闭)函数变量的内部函数 JavaScript 开发的一个关键方面就是闭包:一个可以访问外部(封闭)函数变量的内部函数。 由于 JavaScript 运行时的实现细节,可以通过以下方式泄漏内存:
<script>var theThing = null;var replaceThing = function () {var originalThing = theThing;var unused = function () {if (originalThing) // a reference to 'originalThing'console.log("hi");};theThing = {longStr: new Array(1000000).join("*"),someMethod: function () {console.log("message");},};};setInterval(replaceThing, 1000);
</script>
1.4)DOM 引用
有时候,在数据结构中存储 DOM 结构是有用的。假设要快速更新表中的几行内容。将每行 DOM 的引用存储在字典或数组中可能是有意义的。当这种情况发生时,就会保留同一 DOM 元素的两份引用:一个在 DOM 树种,另一个在字典中。如果将来某个时候你决定要删除这些行,则需要让两个引用都不可达
<script>var elements = {button: document.getElementById("button"),image: document.getElementById("image"),};function doStuff() {elements.image.src = "http://example.com/image_name.png";}function removeImage() {// The image is a direct child of the body element.document.body.removeChild(document.getElementById("image"));// At this point, we still have a reference to #button in the//global elements object. In other words, the button element is//still in memory and cannot be collected by the GC.}
</script>

什么是内存泄漏 ? 什么原因产生的? 如何解决?相关推荐

  1. UWP开发入门(十六)——常见的内存泄漏的原因

    原文:UWP开发入门(十六)--常见的内存泄漏的原因 本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)--用Diagno ...

  2. Android 中内存泄漏的原因和解决方案

    之前研究过一段时间关于 Android 内存泄漏的知识,大致了解了导致内存泄漏的一些原因,但是没有深入去探究,很多细节也理解的不够透彻,基本上处于一种似懂非懂的状态,最近又研究了一波,发现有很多新的收 ...

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

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

  4. 内存泄漏的检测、定位和解决经验总结

    内存泄漏的检测.定位和解决经验总结 温辉敏(wenhm@sina.com) 2006 年 05 月 [摘要] 结合局端MCU项目中CSS.NMS模块内存泄漏检测.修正的过程,简要介绍了内存泄漏检测的工 ...

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

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

  6. 内存泄漏的原因及解决办法_浅谈 JS 内存泄漏问题

    什么是内存泄漏? 程序的运行需要内存.只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存. 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高 ...

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

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

  8. 详细分析内部类的发生内存泄漏的原因

    文章目录 避免内部类中的内存泄漏 步骤1:内部类引用其外部类 步骤2:构造函数获取封闭的类引用 步骤3:声明一种新方法 内存泄漏的解剖 避免内部类中的内存泄漏 使用内部类时要当心垃圾收集 如果您已了解 ...

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

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

  10. 内存泄漏的原因及解决方法

    内存泄漏就是内存中的变量没有回收,一直存在与内存中,造成内存的浪费的行为.常见的内存泄漏有以下5种 1. 意外的全局变量 2. 计时器和回调函数timers 3. DOM泄漏 4. js闭包 5. c ...

最新文章

  1. 在ASP.NET中获取文件属性
  2. Sobel算子及cvSobel
  3. MySQL必知必会读书笔记
  4. 7-6 统计字符串中数字字符的个数_洛谷 || 标题统计(C语言)
  5. 400万奖金池,倪光南、邓中翰等顶级学者指导,大手笔芯片比赛邀你参与
  6. ssl双向认证和单向认证的区别
  7. java中foreach怎么访问,Java对象阵列Foreach方法访问
  8. vc++基于颜色直方图的图像检索,含代码
  9. 《数据中心虚拟化技术权威指南》一2.2 数据中心网络拓扑
  10. struts2几种result type探究
  11. 【转】ORM系列之Entity FrameWork详解
  12. Python中使用PhantomJS抓取Javascript网页数据
  13. asp.net微信公众平台开发
  14. 安卓倒计时 listview默认选中一项
  15. python03_Python中的列表、元组、字典和集合
  16. Android ListView下拉刷新点击加载更多
  17. linux 小度 驱动_arm-linux移植MT7601Uusb无线网卡(小度wifi,360随身WIFI 2代)
  18. 电梯控制线路实训考核系统
  19. 华为Routing Switching切换为Datacom,究竟变了些什么
  20. java能做称重软件_java实现砝码称重

热门文章

  1. 为什么前端都要学Vue?
  2. 接口设计之幂等性设计
  3. [工程经验] 机器人的控制方式与操作模式
  4. ArcGIS二次开发——地图居中显示
  5. 【ArcGIS二次开发】TOCControl右键菜单功能实现
  6. 【Direct3D - 1】D3D基本概念解释
  7. C++ Qt D3D渲染视频数据
  8. Android - 设备的DeviceId
  9. TransparentBlt、StretchBlt与BitBlt三个函数的区别
  10. ios实现基于socket tcp/ip 的通讯