2010-04-14 100 views
6

我刚刚重新启动了我的Firefox浏览器,因为它开始口吃和放慢速度。由于(我的理解)过度的内存使用,每隔一天都会发生这种情况。 我注意到它启动时需要40M,然后,当我注意到速度变慢时,它会跳到 1G,除非关闭其他应用程序,否则我的机器将无法提供更多内容。 我试图理解为什么它的这样一个难题难以解决的技术原因解决 ve。虚拟内存使用率高

Mozilla的有关于高内存页:

http://support.mozilla.com/en-US/kb/High+memory+usage

但是我正在寻找一个稍微更深入的和令人满意的解释。不是超级技术,但足以让问题更加尊重,并请这里的人群。

一些问题我已经琢磨(他们可能是愚蠢所以放轻松):

  • 当我关闭所有标签页,为什么不使用存储器一路走下来?
  • 为什么扩展/主题/插件的内存使用没有限制?
  • 如果长时间保持开放状态,为什么会增加内存使用量?
  • 为什么内存泄漏很难找到并修复?

应用程序和语言不可知的答案也非常感谢。

+0

这个问题有点广泛。 Firefox遭受内存泄漏,最好让您阅读该主题。关闭选项卡不一定会释放为该选项卡分配的内存。 – 2010-04-14 14:33:49

+1

和你的编程问题是? – KevinDTimm 2010-04-14 14:41:14

+1

@KevinDTimm它是列表中的最后一颗子弹 – David 2010-04-14 15:04:14

回答

10

浏览器是一样的人 - 他们变老,他们会变得过于庞大,而他们得到抛弃年轻和更精简的机型。

Firefox不仅仅是一个浏览器,它是一个生态系统。尽管我觉得最近的版本非常臃肿,但核心产品通常是稳定的。

不过,Firefox是一个生态系统/平台:

1)写的不好插件

2)写的不好的JavaScript代码,在其内执行。

3)Adobe Flash作为一个重量级视频平台和写得不好的广告脚本,比如'用一只鸭子击中乌萨马本拉登以降低抵押率并获得免费iPod *(需要参与)。

4)Quicktime和其他媒体播放器。

5)一些嵌入式Java代码。

内存泄漏的描述表明运行amok的脚本或请求更多内存的第三方工具。如果你曾经在Mac上运行Flash,那么几乎是一个给定的CPU利用率的90%。

大多数编程语言的目标不是拯救你,而是给你工具来保存自己。你可以使用任何语言编写不良和臃肿的代码和内存泄漏,包括垃圾收集。第三方工具通常不如平台本身那么好地测试。试图做得太多的网页也并不少见。

如果你想做一个实验来演示这一点,可以使用Firefox获得一个mac,然后去一个写得很好的网站,比如Stack Overflow,花一个小时。你的内存使用量不应该增长太多。然后花5分钟时间访问Myspace上的随机页面。

现在让我试着回答您的问题根据我的猜测,因为我不熟悉的源代码

  • 当我关闭所有标签页,为什么 不内存使用情况去所有的 的方式?

而每个浏览器实例是具有其自己的存储器中的独立过程,在一个窗口中的选项卡都在相同的处理。 Firefox曾经有过某种内存缓存,只是关闭一个标签并不能立即从内存缓存中清除相关信息。如果您重新打开一个标签到同一个网站,您可能会获得更好的性能。有一些高级选项可以让你禁用它,比如browser.cache.memory.enable。或者只是搜索禁用内存缓存。

* Why is there no limits on extensions/themes/plugins memory usage? 

出于同样的原因,Windows或Linux没有应用程序的审查过程,您可以运行它们。这是一个开放的环境,你承担风险。如果你想去的地方应用和扩展“验证”的环境下,苹果可能会去:)

* Why does the memory usage increase if it's left open for long periods of time? 

不是在脚本中的所有计算和行为具有视觉表现的方式。一个脚本可能会在后台做一些事情(例如请求额外的材料,预先获取的东西,只是错误),即使你没有看到它。

* Why are memory leaks so difficult to find and fix? 

这是关于簿记。想想你曾经借过的每一件物品(甚至是一支钢笔),或者是你一生中借用过你的东西。他们都被占了吗?内存泄漏的方式是相同的(你从系统借用内存),除了你传递物品。然后看看桌子上的东西,你是否留下了任何东西,因为'你可能很快就需要它',尽管你可能不会这样做?相同的故事。

+4

好的簿记类比。 – 2010-04-14 16:04:24

+0

@Warren:谢谢! – Uri 2010-04-15 01:23:37

+0

而我在Mac上... – zaf 2010-04-19 15:23:59

2
  • 为什么内存泄漏很难找到并修复?

因为有些开发者拒绝使用像电围栏这样的工具。

+0

Firefox开发者使用Valgrind - 这比电篱笆更有能力。 – slacker 2010-04-19 22:05:43

+0

对他们有好处。我记得使用Valgrind来寻找记忆问题。 (唉,我的代码在当时有很大的麻烦,所以整体经验很痛苦,但这不是Valgrind的错......) – 2010-04-20 08:08:53

1

内存泄漏首先出现,因为您想将内存保留在内存中而不是磁盘上。例如,假设您有一个网页,其中包含图像,CSS,JavaSript,文本。如果要显示页面,每次要使用JavaScript解释器或CSS解析器或字体渲染引擎来显示文本时,都会转到硬盘,那么浏览器将非常慢,有时无法工作完全可以(因为一个JavaScript片段可能需要另一个JavaScript片段留下的变量)。因此,浏览器试图在内存中保留其工作所需的所有东西,并且这些东西可以轻松地交叉引用(JavaScript调用到Adobe Flash,Adobe Flash调用到JavaScript等等)。而且你必须非常小心地使用这些资源引用,因为过早地清理它们并且不按顺序会破坏代码(最好是保留资源,然后突然死亡,因为它不在那里)。

P.S.另请参阅this article了解更多细节。