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

简介: 在讨论内存泄露之前,先介绍几款JavaScript内存监测工具。IE的sIEve与JSLeaksDetector(这两个可以在下面的附件中下载),firefox的Leak Monitor,chrome的Porfiles等。

一、JavaScript内存监测工具


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

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

 

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


image.png

 


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


image.png

 


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


image.png

 


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


image.png


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

  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.点击按钮循环引用


    image.png

 

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


    image.png


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


    image.png


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


  image.png

 


三、闭包引起的内存泄漏



   <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.点击按钮闭包


  image.png


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


  image.png

  

3.点击按钮Show Leaks


  image.png


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

  image.png

 

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

相关文章
|
1月前
|
JavaScript 前端开发 算法
Java Script 中的垃圾回收机制有哪些缺点
Java Script 中的垃圾回收机制有哪些缺点
13 0
|
1月前
|
JavaScript 前端开发 算法
描述 JavaScript 中的垃圾回收机制。
描述 JavaScript 中的垃圾回收机制。
18 1
|
1月前
|
Java 程序员
探讨JVM垃圾回收机制与内存泄漏
探讨JVM垃圾回收机制与内存泄漏
|
7天前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
js 垃圾回收机制的方法
|
9天前
|
存储 缓存 监控
Java内存管理:垃圾回收与内存泄漏
【4月更文挑战第16天】本文探讨了Java的内存管理机制,重点在于垃圾回收和内存泄漏。垃圾回收通过标记-清除过程回收无用对象,Java提供了多种GC类型,如Serial、Parallel、CMS和G1。内存泄漏导致内存无法释放,常见原因包括静态集合、监听器、内部类、未关闭资源和缓存。内存泄漏影响性能,可能导致应用崩溃。避免内存泄漏的策略包括代码审查、使用分析工具、合理设计和及时释放资源。理解这些原理对开发高性能Java应用至关重要。
|
12天前
|
存储 前端开发 安全
JVM内部世界(内存划分,类加载,垃圾回收)(上)
JVM内部世界(内存划分,类加载,垃圾回收)
46 0
|
1月前
|
JavaScript 前端开发 Java
JavaScript的垃圾回收机制
JavaScript的垃圾回收机制
39 1
|
1月前
|
Java 程序员 Python
|
2月前
|
监控 Java 编译器
优化Go语言程序中的内存使用与垃圾回收性能
【2月更文挑战第5天】本文旨在探讨如何优化Go语言程序中的内存使用和垃圾回收性能。我们将深入了解内存分配策略、垃圾回收机制,并提供一系列实用的优化技巧和建议,帮助开发者更有效地管理内存,减少垃圾回收的开销,从而提升Go程序的性能。
|
3月前
|
前端开发 JavaScript 算法
JavaScript 内存管理的秘密武器:垃圾回收(下)
JavaScript 内存管理的秘密武器:垃圾回收(下)
JavaScript 内存管理的秘密武器:垃圾回收(下)