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

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

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

  1. root和两个子内容(child1和child2)
  2. 从child1切换到child2,要求我的应用程序管理员在附加child2之前删除child1
  3. child2正在附加(我可以看到它)但我仍然可以使用管理child1的代码中的child1元素

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释放所有内存。

在释放对它的所有引用之前,它不会从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。

关于SO的另一篇文章: jQuery内存泄漏与DOM删除