如何避免JavaScript的内存泄露及内存管理技巧

发表于谷歌WebPerf(伦敦WebPerf集团),??2014年8月26日。

  高效的JavaScript Web应用必须流畅,快速。与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果消耗过多,页面就会崩溃,迫使用户重新加载。而你只能躲在角落哭泣。

  自动垃圾收集是不能代替有效的内存管理的,特别是在大型,长时间运行的Web应用程序中。在这次讲座中,我们将演示如何通过Chrome的DevTools对内存进行有效的管理。

  并了解如何解决性能问题,如内存泄漏,频繁的垃圾收集暂停,和整体内存膨胀,那些真正让你耗费精力的东西。

  Addy Osmani在他的PPT中展示了很多会在Chrome V8中产生内存泄漏的示例:

  1) Delete一个Object的属性会让此对象变慢(多耗费15倍的内存)


1

2

3

4

5

6

var o = { x: ‘y‘ };

delete o.x; //此时o会成一个慢对象

o.x; //

var o = { x: ‘y‘ };

o = null//应该这样

  2) 闭包

  在闭包中引入闭包外部的变量时,当闭包结束时此对象无法被垃圾回收(GC)。


1

2

3

4

5

6

var a = function() {

  var largeStr = new Array(1000000).join(‘x‘);

  return function() {

    return largeStr;

  }

}();

  3) DOM泄露

  当原有的COM被移除时,子结点引用没有被移除则无法回收。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

var select = document.querySelector;

var treeRef = select(‘#tree‘);

//在COM树中leafRef是treeFre的一个子结点

var leafRef = select(‘#leaf‘); 

var body = select(‘body‘);

body.removeChild(treeRef);

//#tree不能被回收入,因为treeRef还在

//解决方法:

treeRef = null;

//tree还不能被回收,因为叶子结果leafRef还在

leafRef = null;

//现在#tree可以被释放了。

  4) Timers计(定)时器泄露

  定时器也是常见产生内存泄露的地方:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

for (var i = 0; i < 90000; i++) {

  var buggyObject = {

    callAgain: function() {

      var ref = this;

      var val = setTimeout(function() {

        ref.callAgain();

      }, 90000);

    }

  }

  buggyObject.callAgain();

  //虽然你想回收但是timer还在

  buggyObject = null;

}

  5) 调试内存

  Chrome自带的内存调试工具可以很方便地查看内存使用情况和内存泄露:

  在 Timeline -> Memory 点击record即可:

  更多内容请查看原PPT。

  原文地址: 点此

时间: 2024-10-11 00:44:33

如何避免JavaScript的内存泄露及内存管理技巧的相关文章

进程结束后,进程的所有内存都将被释放,包括堆上的内存泄露的内存。

进程结束后,进程的所有内存都将被释放,包括堆上的内存泄露的内存.原因是,当进程结束时,GDT.LDT和页目录都被操作系统更改,逻辑内存全部消失,可能物理内存的内容还在但是逻辑内存已经从LDT和GDT删除,页目录表全部销毁,所以内存会被全部收回. 一下这段代码,我个人认为可以作为例证,不对请多指教: [c-sharp] view plaincopy #include <cstdlib> using namespace std; const static int const_once = 1024

内存泄露和内存溢出

在以前我潜意思里面一直觉得内存溢出和内存泄露是一个意思...今天有人拿这个来问我,我才想起来这两个是有点区别的,真是有点不好意思哈哈. 不过他们还真有点关系,一般来说,内存泄露是内存溢出的一个原因之一,当然,内存溢出还有很多原因. 内存泄露:是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序内存无限增长.更广义的内存泄露包括未对系统的资源的及时释放,比如不会再用的引用. 内存溢出:用户在对其数据缓冲区操作时,超过了其缓冲区的边界:尤其是对缓冲区写操作时,缓冲区的

【Android高级】内存泄露与内存溢出

一.内存泄露 二.内存溢出

内存泄露与内存溢出的区别

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产

转载:内存泄露与内存溢出的区别

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产

java中内存泄露和内存溢出

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产

内存泄露与内存访问越界

内存泄露 在堆上分配的内存,没有及时释放掉,以便后面其它地方可以重用.在C/C++中,内存管理器不会帮你自动回收不再使用的内存.如果你忘了释放不再使用的内存,这些内存就不能被重用,就造成了所谓的内存泄露. 一两处内存泄露通常不至于让程序崩溃,也不会出现逻辑上的错误,当然了,量变会产生质变,一旦内存泄露过多以致于耗尽内存,后续内存分配将会失败,程序可能因此而崩溃. 内存访问越界,使用的内存 超出了 向系统申请了一块内存,覆盖该空间之后的一段存储区域,导致系统异常. 常见原因: 1 写越界,又叫缓冲

内存泄露、内存溢出以及解决方法

内存泄露是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序内存无线增长.更广义的内存泄露包括未对系统的资源的及时释放,比如句柄等. 内存溢出即用户在对其数据缓冲区操作时,超过了其缓冲区的边界:尤其是对缓冲区写操作时,缓冲区的溢出很可能导致程序的异常. 一.内存泄露 "知己知彼,方能百战不殆",如果我们能够比较清楚的了解在编程的时候哪些情况容易导致内存泄露,通过避免这些糟糕的情况,从提高代码的质量本身出发,来抵御潜在导致内存泄露的发生. 1.1先来看看内

android 内存泄露 /进程 内存检查 --DDMS工具

一.监控操作步骤 1.打开eclipse,切换到DDMS模式,连接设备,打开usb调试,如图: 2.在devices栏中会显示连接的设备,选择要监控的程序包名 3.点击devices视图中update Heap 4.在Heap视图中点击Gause GC, 二.判断内存泄露 Heap视图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类类型的对象.在data object一行中有一列是"Total Size",其值就是当前进程中所有Java数据对象的