如何强制Firefox(版本6)释放内存?

5
我正在开发一款类似幻灯片的网络应用程序,其中当前的图像会绘制到画布上,您可以通过下一个/上一个按钮浏览图像。这些图片是使用someImage.src加载的,为了性能的原因,我在用户查看第一张图像时在后台进行预加载。 Firefox 在预加载期间分配了大量的内存(比 Chrome 或 Safari 高20-30倍,甚至比 IE 还多两倍)。此外,如果我更改幻灯片展示方式,即使在网站URL保持不变的情况下通过在后台加载幻灯片展示的xml描述(使用下拉菜单),也不会释放任何内存,而是会分配大量新的内存。只有当我更改或重新加载网站的URL时,Firefox才会释放内存。这种行为与其他所有浏览器都不同。
出现了什么问题?为什么 Firefox 要那么贪心?有没有办法解决这个问题? 是否有一种方法可以强制 Firefox 释放内存或减少它用于预缓存已加载(但未显示)的图像所使用的内存?

1
这不是一个建设性的评论,但我早就放弃了相信Firefox会小心处理内存的能力。尽管Firefox 7 beta应该已经改善了这种情况。 - Gregory Pakosz
据我所知,JavaScript的垃圾回收器是不可直接调用的,所以我认为你没办法了。 - pimvdb
@Gregory: 可能不具建设性,但总是好听到你并不是唯一一个遇到这种情况的人,对吧? - Kai Huppmann
2个回答

6
即使看起来Firefox分配了越来越多的内存,这可能是具有欺骗性的。Firefox垃圾回收器的工作方式有些奇怪(对我来说)。在Firefox决定释放大块内存之前,它通常需要2-8分钟的时间。也许值得查看源代码。
然而,你可以通过将一些变量/引用设置为null来加速处理速度,以便垃圾回收器有机会更早地检测应该丢弃什么。这在canvas元素/引用中尤其是一个好主意。所以,只需轻松设置不再使用/需要的变量即可。
myCanvasRef = null;

我应该为您做一些工作。如果您仍然认为Firefox使用的内存过多,请打开一个新标签页并输入about:memory。这将提供当前浏览器内存使用情况的详细视图。例如,您可以看到内存是否用于Javascript代码、图像或其他有用于限制不良行为的内容。


delete语句怎么样?(我想nullundefineddelete都一样有效,因为它们都会减少对象的引用计数。) - Delan Azabani
我会谨慎使用 delete,特别是考虑到其他浏览器(当然,尤其是IE)。不过我认为null和undefined之间没有区别。 - jAndy
1
“null”和“undefined”在同一目的下可以互换使用,但是“null”总是一个对象,而“undefined”则总是一个原始值。 - Delan Azabani

1
如果你在这里寻找“如何在Firefox中强制进行GC”的方法,其中一种方法是导航到about:memory,然后单击“gc”按钮。

不幸的是,在我的特定情况下,这似乎并没有帮助太多,但如果对关注者有用,那么就可以使用link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接