假人的内存使用率很高

时间:2010-04-14 14:18:41

标签: c++ firefox memory-management memory-leaks

我刚刚重新启动了我的firefox网络浏览器,因为它开始出现口吃和放慢速度。由于(我的理解)过多的内存使用,这种情况每隔一天发生一次。 我注意到它开始时需要40M,然后,当我注意到减速时,它会进入  1G和我的机器没有什么可提供的,除非我关闭其他应用程序。 我试图理解为什么要解决这么难的问题背后的技术原因 已经

Mozilla有一个关于高内存使用量的页面:

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

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

我已经在思考的一些问题(它们可能很愚蠢,所以放轻松):

  • 当我关闭所有标签时,为什么内存使用量不会一直下​​降?
  • 为什么扩展/主题/插件内存使用没有限制?
  • 如果长时间保持打开状态,为什么内存使用量会增加?
  • 为什么内存泄漏难以找到并修复?

应用和语言无关的答案也非常感谢。

4 个答案:

答案 0 :(得分:10)

浏览器就像人一样 - 他们变老了,他们变得臃肿,而且他们会因为更年轻和更瘦的模特而被抛弃。

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

然而,firefox是一个生态系统/平台:

1)写得不好的插件

2)在其中执行的编写错误的JavaScript代码。

3)Adobe Flash作为重量级视频和写得不好的广告脚本的平台,例如“用鸭子打奥萨马·本·拉登”以降低抵押贷款利率并获得免费的iPod *(需要参与)。

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

5)一些嵌入式Java代码。

内存泄漏的描述表明运行错误的脚本或请求更多内存的第三方工具。如果您曾经在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没有对应用程序进行审查,您可以在它们上运行。这是一个开放的环境,你承担风险。如果您想要一个“验证”应用程序和扩展程序的环境,Apple可能就是这样:)

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

并非脚本中的所有计算和操作都具有可视化表现形式。一个脚本可能在后台做一些事情(比如请求额外的材料,预取东西,只是bug),即使你没有看到它。

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

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

答案 1 :(得分:2)

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

因为一些开发人员拒绝使用像Electric Fence这样的工具。

答案 2 :(得分:1)

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

P.S。有关一些血腥的详细信息,另请参阅this article

答案 3 :(得分:0)

维基百科有一篇关于记忆泄漏的神篇文章:http://en.wikipedia.org/wiki/Memory_leak