在重型AJAX应用程序中,Firefox特定内存会增加

我很困惑为什么我的应用程序的内存在Firefox中的增长速度比其他浏览器快得多。

基本上,该应用程序使用了相当数量的AJAX,其基本操作是加载具有平均HTML级别的新post集,并且通常具有大图像。 每个post的总平均数据量(包括加载的图像)低于1MB,可能是900k。 使用jQuery 1.7.1。

在Chrome中,内存似乎很稳定,但在Firefox中,每次后期加载都会导致大约20MB的新内存使用量。 由于加载了很多post,你的内存很快就会超过1GB甚至1.4GB,而且事情很快就会停滞不前。

深入研究Firefox,我尝试使用’delete’消除闭包和任何无关的变量。 没有太大的进步。 然后我开始删除function,似乎一切都做出了贡献。

删除工具提示,一些过​​多的FB小部件重新加载(每个post一个评论小部件),我做了一个很大的改进,每个post下降到10MB新内存。

但除此之外,我不能低得多! 基本上,如果我只是通过$ .post()加载新的html +图像(再次大约900k),每个post都会增加~8mb的新内存,即使新图像有“display:none”。 (也试过禁用萤火虫)。

这是我第一次尝试内存管理,但这似乎是一个很大的开销,而且奇怪,因为我认为内存确实没有像Chrome那样增加。 好像我应该让内存增加​​更多符合加载的数据量,而不是10倍! (或者根本没有像Chrome一样好的……)

这真的合理吗? 关于在哪里寻找问题或我可以做些什么以进一步减少这个问题的任何想法?

谢谢!

更新

正如鲍里斯恰当地观察到的那样,内存增加几乎完全是由于图像(至少80%)。 但是内存的增加再次是加载图像大小(10倍)。 我学习使用的另一件事:内存 – 如果我只是打开一个新的空标签,内存会迅速下降,几乎所有添加的图像相关内存都会消失。 我猜这是GC的开始,因此正如鲍里斯猜测的那样,它似乎可能是一个GC问题?

如果是这种情况,我如何调查为什么它不会仅在FF中自然触发? 有没有办法在JS中触发它? 正如我所提到的,我试图通过删除闭包……

另一个想法,可以将事件(通过jQuery)绑定到图像元素而不是div是坏的吗? 我认为jQuery处理了所有这些东西。

我看到我打了2gb的ram

我的Dock中有一个小部件触发此命令,该命令保存在文件中:

 killall -c firefox sleep 1 open -a Firefox sleep 1 exit 

快速重置FF并重新获得所有标签的方法。 需要大多数时间这样做:)如果不是Firebug我现在就在Chrome上

如果你真的使用了很多ajax,你可以尝试将$ .ajax()选项“cache”设置为false。 但是,它必须是大量数据才能对浏览器内存产生影响。

出于性能原因,您通常希望在内存中尽可能多地进行操作,并尽可能少地写入DOM。

可能只是你正在使用的FF版本不是回收内存以及你正在比较它的其他浏览器。

在我看来,闭包不是罪魁祸首。 这似乎更像是一个旧的IE问题。

如果它确实是一个问题,当你知道它们不再被使用时,你可以尝试明确地销毁它们。

不一定是答案,但你是否在使用最新版本的Firefox(13)时遇到这些问题? 这个版本存在很多与内存和性能相关的问题,Mozilla已经表示他们正在努力修复它们。

此外,如果您在页面加载时加载了大量项目并且最初都没有显示它们,则可以使用jquery的waypoints插件动态加载这些图像。 它可以减轻浏览器在页面加载时感受到的很多重量。

希望这些都有帮助。 这里有一些阅读材料可以帮助您进一步:

http://support.mozilla.org/en-US/kb/firefox-slow-how-make-it-faster http://support.mozilla.org/en-US/kb/firefox-uses-too-much -Memory-RAM

和http://imakewebthings.com/jquery-waypoints/