leak finder

介绍

leak finder 是google开源团队发布了一个新的可以帮助web应用程序开发者在他们的JavaScript程序中找出内存泄露问题的工具;

http://feedproxy.google.com/r/GoogleOpenSourceBlog/3/xgd4c83Bc4M/leak-finder-new-tool-for-javascript.html

项目文档: https://code.google.com/p/leak-finder-for-javascript/

内存泄露

javascript是一门具有垃圾收集机制的语言,不会因为忘记释放内存而出现传统的内存泄露问题,因为如果对象的所有引用被drop后,对象会被回收,内存会自动释放。
通常我们使用new创建对象,GC负责回收对象占用内存区域, GC在回收内存时,首先会判断该对象是否被其它对象引用。在确定没有其它对象引用便释放该对象内存区域。但是,JavaScript程序会在无意间保留对象引用而造成内存泄露。
内存泄露CASE
1、Native对象(例如Dom、ActiveX Object)与Javascript对象间的循环引用, 在IE中出现leak情况比较多,源于IE的对Native Object and Javascript Object 的GC回收机制不同;
2、Closure 可以参考 http://jibbering.com/faq/notes/closures/

举例说明

function Cat() {     
   var name = "Kitty";     
   var age = "1"; 
   this.version = 1; 
    var setAge = function(newAge){ 
    }; 
    return setAge; 
} 
var myCat = new Cat(); 

为什么导致momery leak?

因为在new Cat()后,局部变量setAge的作用域链被改变, GC得不到释放,这种情况会被定义为momery leak

leak finder 使用

One such definition is: If a goog.Disposable object was notdispose()d, but the user code dropped all references to it, it's unintentionally alive. (Such objects are kept alive by the goog.Disposable.instances_ array when the Disposable monitoring mode is enabled.)
在可能泄露的对象上加入如下继承,如上述实例:
goog.inherits(Cat, goog.Disposable);
同时在对象的构造中执行 goog.base(this), 如下:

function Cat() {
    goog.base(this)
    var name = "Kitty";
    var age = "1";
    this.version = 1;
    var setAge = function(newAge){
    };
    return setAge;
}

goog.inherits(Cat, goog.Disposable);
var myCat = new Cat();

MyObj = function() {
    goog.base(this);
}

goog.inherits(MyObj, goog.Disposable);

MyObjCreator = function() {
}

MyObjCreator.prototype.Create = function() {
  return new MyObj();
}

var creator = new MyObjCreator();

// Not a leak.
var handle = creator.Create();

// Leak.
var handle2 = creator.Create();
handle2.dispose();
handle2 = null;
posted @ 2014-07-29 13:39  mininice  阅读(475)  评论(0编辑  收藏  举报