zoukankan      html  css  js  c++  java
  • 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;
    
  • 相关阅读:
    RAID磁盘阵列
    Activiti任务认领
    Activiti 5.18启动流程到完成所有任务之间的数据库变化(转)
    tomcat优化(转)
    DB2 OLAP函数的使用
    PreparedStatement批量处理和事务
    获取JavaScript异步函数的返回值
    DB2 sql报错后查证原因与解决问题的方法
    DB2有五种约束
    连接db2数据库出现No buffer space available (maximum connections reached?)
  • 原文地址:https://www.cnblogs.com/mininice/p/3875326.html
Copyright © 2011-2022 走看看