介绍

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

http://feedproxy.google.com/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;
05-11 09:33