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

Phi*_*ben 9 memory ajax firefox jquery image

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

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

在Chrome中,内存似乎很稳定,但在Firefox中,每次后期加载都会导致大约20MB的新内存使用量.由于加载了很多帖子,你的内存很快就会达到1GB甚至1.4GB,而且事情很快就会停止.

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

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

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

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

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

谢谢!

更新:

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

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

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

Rin*_*ngo 1

如果您确实使用了大量 ajax,您可以尝试将 $.ajax() 选项“cache”设置为 false。不过,必须有大量数据才能对浏览器内存产生影响。

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

可能只是因为您使用的 FF 版本回收内存的能力不如您与之比较的其他浏览器。

在我看来,关闭并不是罪魁祸首。这看起来更像是一个古老的 IE 问题。

如果这确实是一个问题,当您知道大型对象不再被使用时,您可以尝试显式销毁它们。