jQuery.remove(),分离DOM元素,但我仍然可以从代码中访问元素。如何避免泄漏?

时间:2011-11-04 12:37:04

标签: javascript jquery memory-management memory-leaks

我知道在具有大量UI元素的应用程序中正确管理内存并且完全基于Ajax并不容易(在我的应用程序中,页面永远不会重新加载)。但我想了解以下行为:

我有一个根元素,一次只能附加一个子元素(将其视为根元素是app容器,子元素是单个页面)。 每当我在子内容之间切换时,我都会使用jQuery.remove()删除以前的内容,但我发现内容实际上是从DOM中分离出来的,但它仍保留在内存中。

  1. root和两个子内容(child1和child2)
  2. 来自child1的
  3. 我切换到child2,要求我的应用管理员在附加child2之前删除child1
  4. 正在附加child2(我可以看到它)但我仍然可以使用管理child1的代码中的child1元素
  5. child1代码(包含对child1 DOM的引用):

    function testaccess(){
       load_and_remove(child2);
       var child1DOM = get_this_dom();
    }
    

    child1DOM仍然存在,我可以操纵它,好像它仍然附加到DOM。

    好吧,我想jQuery.remove()和GC将无法释放内存,直到我有代码可以访问它,但即使我没有调用get_this_dom(),即使退出testaccess( ),我看到FF内存没有减少...

    当我退出child1时,我想知道如何让GC释放所有内存。

1 个答案:

答案 0 :(得分:6)

在释放对它的所有引用之前,它不会从DOM中删除。

您应该尝试删除JS DOM和呈现DOM之间的所有循环引用 - 它们都有单独的垃圾收集器并单独工作。因此,为什么标记和扫描JS垃圾收集器不会捕获它们。

您可以尝试重新编写代码以打破循环引用:

var mything = something();
mything = null;

以下是一些可能有用的文章:

http://msdn.microsoft.com/en-us/library/Bb250448

http://www.javascriptkit.com/javatutors/closuresleak/index.shtml

http://javascript.info/tutorial/memory-leaks

我很确定你可以很快找到更多。

此外,您可以尝试.empty()释放所有子节点,但它会调用.remove()来完成一些工作。

请注意,其中一些问题已在较新版本的jQuery中修复,例如1.5优于1.4。

关于此问题的另一篇文章:jQuery memory leak with DOM removal