我知道在具有大量UI元素的应用程序中正确管理内存并且完全基于Ajax并不容易(在我的应用程序中,页面永远不会重新加载)。但我想了解以下行为:
我有一个根元素,一次只能附加一个子元素(将其视为根元素是app容器,子元素是单个页面)。 每当我在子内容之间切换时,我都会使用jQuery.remove()删除以前的内容,但我发现内容实际上是从DOM中分离出来的,但它仍保留在内存中。
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释放所有内存。
答案 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