2010-04-14 106 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瞭解更多細節。