zoukankan      html  css  js  c++  java
  • 内存泄漏是怎么一回事?

    内存泄漏

    由于IE9之前的版本对JScript对象和COM对象使用不同的垃圾收集例程因此闭包在IE的这些版本中会导致一些特殊的问题。具体来说,如果闭包的作用域链中保存着一个HTML元素,那么就意味着该元素将无法被销毁。来看下面的例子。

    function assignHandler(){

      var element = document.getElementById("someElement");

       element.onclick = function(){

        alert(element.id);

      };

    }
     

    以上代码创建了一个作为element元素事件处理程序的闭包,而这个闭包则又创建了一个循环引用,由于匿名函数保存了一个对assignHandler()的活动对象的引用,因此就会导致无法减少element的引用数。只要匿名函数存在,element的引用数至少也是1,因此它所占用的内存就永远不会被回收。不过,这个问题可以通过稍微改写一下代码来解决,如下所示。

    function assignHandler(){

      var element = document.getEle

        mentById("someElement");

          var id = element.id;

          element.onclick = function(){

           alert(id);
     
        };

        element = null;

        }
     
     在上面的代码中,通过把element.id的一个副本保存在一个变量中,并且在闭包中引用该变量消除了循环引用。但仅仅做到这一步,还是不能解决内存泄漏的问题。必须要记住:闭包会引用包含函数的整个活动对象,而其中包含着element。即使闭包不直接引用element,包含函数的活动对象中也仍然会保存一个引用。因此,有必要把element变量设置为null。这样就能够解除对DOM对象的引用,顺利地减少其引用数,确保正常回收其占用的内存。

  • 相关阅读:
    关于 Profile
    empty
    Vim Editor
    C++ Note
    Android NDK Sample
    Dealing with the ! when you import android project
    File attributes and Authority of Linux
    Java与C的相互调用
    The source code list of Android Git project
    Enable Android progurad in the case of multiple JAR lib
  • 原文地址:https://www.cnblogs.com/wuxianqiang/p/6735808.html
Copyright © 2011-2022 走看看