JavaScript垃圾回收(三)——内存泄露

简介:

一、JavaScript内存监测工具

在讨论内存泄露之前,先介绍几款JavaScript内存监测工具。

IE的sIEve与JSLeaksDetector(这两个可以在下面的附件中下载),firefox的Leak Monitor,chrome的Porfiles等。

 

1、Leak Monitor好不容易找到下载链接,但是我的firefox的版本安装不了。

 

2、chrome的Porfiles,点击F12就能看到,如下图所示:

 

3、IE的JSLeaksDetector,我用的是win7系统,后面发现64位的浏览器不支持,只有打开32位的IE8才有这个插件。这插件不会用。

 

 

4、IE的sIEve,接下来的演示都是使用这个工具。

 右下脚表格每列的头代表如下:

  1. usage 内存使用
  2. delta 内存增减。绿色是内存减少,红色是内存增加
  3. #inUse 在使用的 HTML 节点,比如 div
  4. #leaks 泄露的 HTML 节点,比如 div

 

二、循环引用

   <p id="leak1"></p>
    <input type="button" id="btnCycle" value="循环引用" onclick="cycle_leak()"/>
     var host = {mycycle:''};
        function cycle_leak() {
            var cycle = document.getElementById('leak1');
            host.mycycle = cycle;
            cycle.setAttribute('cycle', host);
        }

1、设置了一个变量host,它的一个属性mycycle赋值为一个id为leak1的p对象

2、设置id为leak1的p对象的一个自定义属性为host变量

通过工具来查看:

  1.点击按钮循环引用

    

 

  2.点击左上角的按钮scan now

    

  3.点击左上角的按钮show in use

    

  4.可以看到id=leak1的p标签,存在循环引用

  

 

三、闭包引起的内存泄漏

   <input type="button" id="btnClosure" value="闭包" onclick="closure_leak()"/>
    <p id="pMemory"></p>
     //闭包
        function closure_leak(){
            var el = document.getElementById('pMemory');
            el.onclick=function(){
                alert(this.id);
            }
            //移除节点
            if (el.removeNode) {   
                el.removeNode(true);   
            }else if (el.parentNode) {   
                el.parentNode.removeChild(el);   
            }
            //页面刷新
            location.reload();
        }

这里有一点要注意一下,我原先电脑中的是IE9,IE9已经不会出现这个问题了,后面倒退到IE8才看到泄漏。

el是一个Dom元素,el引用了它的click事件的监听函数,同样该函数通过其作用域链也引用回了el元素。具体如下:

1、closure_leak()执行时创建的作用域对象叫做ScopeA

2、ScopeA引用DOM对象el

3、DOM对象el引用函数function(){alert(this.id);}

4、函数function(){alert(this.id)}引用ScopeA

5、移除节点和页面刷新是为了在sIEve查看到泄漏节点

通过工具来查看:

  1.点击按钮闭包

   

  2.右边的Memory Usage中可以看到leaks为1

  

  3.点击按钮Show Leaks

  

  4.显示泄漏节点的信息,不知道为什么ID没有显示出来,我明明有ID的

  

 

用这个工具可以看到泄漏的情况,但是还不是很会用,网上很多的泄漏情况我还不能用这个工具提现出来。这个工具我也只是简单的展示用用,具体操作还需要进一步的研究。

 

sIEve与JSLeaksDetector工具下载:

http://download.csdn.net/download/loneleaf1/8008215

demo下载:

http://download.csdn.net/detail/loneleaf1/8031073

 

 

参考资料:

http://kb.cnblogs.com/page/74836/ GC与JS内存泄露

http://www.iteye.com/topic/172891 sIEve软件使用简介

http://blog.csdn.net/samxx8/article/details/7486372 javascript 内存监测工具

http://www.cnblogs.com/hyddd/archive/2013/02/07/2908598.html Javascript垃圾回收浅析

http://blog.jobbole.com/49084/ JavaScript 垃圾回收

http://kb.cnblogs.com/page/137723/ 减少javascript垃圾回收[译]

http://www.jianshu.com/p/84a8fd5fa0ee JavaScript内存管理

http://www.cnblogs.com/rainman/archive/2009/03/07/1405624.html JavaScript内存泄漏

http://www.blogjava.net/JAVA-HE/archive/2009/10/27/299856.html   JavaScript 内存泄露

http://www.cnblogs.com/lhb25/archive/2009/08/09/1542386.html JavaScript 中的内存泄露模式

http://adamlu.com/?p=418 Javascript内存泄漏



    本文转自 咖啡机(K.F.J)   博客园博客,原文链接:http://www.cnblogs.com/strick/p/4002010.html,如需转载请自行联系原作者



相关文章
|
10月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
4月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
443 55
|
10月前
|
JavaScript 前端开发 算法
JS垃圾回收
【10月更文挑战第30天】JavaScript 的垃圾回收机制是保证程序稳定运行的重要组成部分。了解垃圾回收的原理和算法,以及注意避免内存泄漏的问题,可以帮助开发者更好地利用 JavaScript 进行高效的开发
|
10月前
|
JavaScript 前端开发 Java
避免 JavaScript 中的内存泄漏
【10月更文挑战第30天】避免JavaScript中的内存泄漏问题需要开发者对变量引用、事件监听器管理、DOM元素操作以及异步操作等方面有深入的理解和注意。通过遵循良好的编程实践和及时清理不再使用的资源,可以有效地减少内存泄漏的风险,提高JavaScript应用程序的性能和稳定性。
|
10月前
|
算法 JavaScript 前端开发
垃圾回收机制对 JavaScript 性能的影响有哪些?
【10月更文挑战第29天】垃圾回收机制对JavaScript性能有着重要的影响。开发者需要了解不同垃圾回收算法的特点和性能开销,通过合理的代码优化和内存管理策略,来降低垃圾回收对性能的负面影响,提高JavaScript程序的整体性能。
|
6月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
5月前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
JS回收机制方法讲解
|
10月前
|
JavaScript 前端开发 Java
垃圾回收机制会导致内存泄漏吗?
【10月更文挑战第29天】虽然JavaScript的垃圾回收机制本身是为了有效地管理内存,但开发者在编写代码时需要注意上述这些可能导致内存泄漏的情况,遵循良好的编程习惯,及时释放不再使用的资源,以确保程序能够高效地利用内存资源,避免出现内存泄漏问题。
|
10月前
|
存储 JavaScript 前端开发
JavaScript的垃圾回收机制
【10月更文挑战第29天】JavaScript的垃圾回收机制是确保程序高效运行的重要保障,了解其工作原理和相关注意事项,有助于开发者更好地编写高性能、稳定的JavaScript代码。
|
10月前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
370 77