介绍

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;

leak finder的更多相关文章

  1. [转]Google开源Leak Finder—用于检测内存泄漏的JavaScript工具-----可惜,暂时打不开google的网站,下载不了

    近日,Google开源了Leak Finder,这款工具可以查看JavaScript应用的堆,进而发现内存泄漏. 作为一门垃圾收集语言,JavaScript并不会出现常见的内存泄露情况,特别是像C++ ...

  2. Linux 动态链接库

    如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...

  3. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  4. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  5. Frontend Development

    原文链接: https://github.com/dypsilon/frontend-dev-bookmarks Frontend Development Looking for something ...

  6. Linux 动态链接库 - dll劫持

    如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...

  7. 【转载】10 个实用技巧,让 Finder 带你飞

    来自:http://sspai.com/27403/ Finder 是 Mac 电脑的系统程序,有的功能类似 Windows 的资源管理器.它是我们打开 Mac 首先见到的「笑脸」,有了它,我们可以组 ...

  8. 使用Visual Leak Detector for Visual C++ 捕捉内存泄露

    什么是内存泄漏? 内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段 ...

  9. iOS之使用模拟器报错:resource fork, Finder information, or similar detritus not allowed

    很奇怪的问题,使用真机测试没有问题.但使用模拟器测试的时候就会报这样的错误,错误类型为:Code Sign Error 错误提示是这样:resource fork, Finder informatio ...

随机推荐

  1. pwd 命令详解

    pwd 作用: 以绝对路径的方式显示用户当前工作目录,命令将当前目录的全路径名称(从根目录)写入标准输出, 全部目录使用/分隔,第一个/表示根目录, 最后一个/ 表示当前目录. 执行pwd 命令可以立 ...

  2. Redis在APP中的应用

    前言 redis 是内存型数据库,读取data速度远快于mysql和sqlserver,如果将APP中列表信息或者一些常被访问的信息转存至内存上,然后APP通过redis读取内存上的数据,那么APP的 ...

  3. VS 2017 Web项目需要安装Sql Server 2012 Express LocalDB问题

    最近在做mvc5的练习 ,结果到了数据库连接这一阶段就出现了问题,开始我以为<add name="MovieDBContext" connectionString=" ...

  4. 环形进度条的实现方法总结和动态时钟绘制(CSS3、SVG、Canvas)

    缘由: 在某一个游戏公司的笔试中,最后一道大题是,“用CSS3实现根据动态显示时间和环形进度[效果如下图所示],且每个圆环的颜色不一样,不需要考虑IE6~8的兼容性”.当时第一想法是用SVG,因为SV ...

  5. vue:简单方法替代vuex或者bus

    兄弟组件,隔代组件传值很麻烦,方法虽然多,但都各有缺点. vuex: 适合数据量大,并且函数集中处理. bus:适合数据虽少,却不得不用的时候,维护困难. root:这儿指将值挂在root组件上,需要 ...

  6. vue2.0 配置sass

    一.配置sass依赖 npm install node-sass --save-dev npm install sass-loader --save-dev 二.打开build文件夹下的webpack ...

  7. windows系统下使用cd命令

    如果要切换到D:\Program Files目录下,大多数人会想当然的在命令行窗口输入 cd D:\Program Files回车. 如下所示: 发现并没有切换到D:\Program Files. 正 ...

  8. T-SQL逻辑查询处理

    引言 本文是对<Microsoft SQL SERVER 2008技术内幕 T-SQL查询>中的第一章做的阅读笔记,这一章的主要内容是分析SQL查询中各子句的执行顺序.如果你对此已了然于胸 ...

  9. SLAVE为什么一直不动了

    导读 遇到SLAVE延迟很大,binlog apply position一直不动的情况如何排查? 问题描述 收到SLAVE延迟时间一直很大的报警,于是检查一下SLAVE状态(无关状态我给隐去了):   ...

  10. [转载]mysql绑定参数bind_param原理以及防SQL注入

    假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. <?php $username = "aa ...