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

标签 javascript jquery memory-management memory-leaks

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

我有一个根元素,一次必须附加一个子元素(将其视为根元素是应用程序容器,子元素是单个页面)。 每当我在子内容之间切换时,我都会使用 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 memory leak with DOM removal

关于javascript - jQuery.remove(),分离 DOM 元素,但我仍然可以从代码中访问这些元素。如何避免泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8009269/

相关文章:

javascript - jQuery/Bootstrap : Child DIV opens up Parent Modal

php - 如何获取ajax事件的当前加载百分比?

java - 修复 java 代码以显示文件上传错误消息

javascript - 语法错误 : unterminated string literal javascript

data-structures - 内存映射 - 部分基于磁盘的算法

android - 缓存目录不存在

javascript - 将两个不同的html页面内容复制到一个页面中

javascript - vue js Prop 重置计时器

javascript - Jquery Mobile - onhashchange 问题

c++ - 在单线程应用程序中在堆栈上分配大量内存是否可以?