Высокое использование памяти для чайников - PullRequest
6 голосов
/ 14 апреля 2010

Я только что перезапустил свой браузер Firefox снова, потому что он начал заикаться и замедляться. Это происходит через день из-за (моего понимания) чрезмерного использования памяти. Я заметил, что это занимает 40M, когда он запускается, а затем, когда я замечаю замедление, он идет к 1G и моей машине больше нечего предложить, если я не закрою другие приложения. Я пытаюсь понять технические причины, по которым такая сложная проблема решается ве.

У Mozilla есть страница о высоком использовании памяти:

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

Но я ищу немного более глубокое и удовлетворительное объяснение. Не супер технический, но достаточно, чтобы придать вопросу больше уважения и порадовать толпу здесь.

Некоторые вопросы, которые я уже обдумываю (они могут быть глупыми, так что полегче):

  • Когда я закрываю все вкладки, почему использование памяти не сокращается?
  • Почему нет ограничений на использование памяти расширениями / темами / плагинами?
  • Почему увеличивается использование памяти, если она остается открытой в течение длительного времени?
  • Почему утечки памяти так трудно найти и исправить?

Ответы на приложения и независимые от языка сообщения также высоко ценятся.

Ответы [ 4 ]

10 голосов
/ 14 апреля 2010

Браузеры похожи на людей - они стареют, они раздуваются, и их бросают на более молодых и худых моделях.

Firefox - это не просто браузер, это экосистема. Хотя я чувствую, что последние версии довольно раздуты, основной продукт в целом стабилен.

Тем не менее, Firefox является экосистемой / платформой для:

1) Плохо написанные плагины

2) Плохо написанный код JavaScript, который выполняется внутри него.

3) Adobe flash в качестве платформы для тяжелого видео и плохо написанных рекламных сценариев, таких как «ударить Усаму бен Ладена уткой, чтобы снизить процентную ставку по закладной и получить бесплатный iPod * (требуется участие).

4) Quicktime и другие медиаплееры.

5) Некоторый встроенный код Java.

В описании утечки памяти предлагается скрипт, запускающий amok, или сторонний инструмент, запрашивающий больше памяти. Если вы когда-либо запускали Flash на Mac, это почти что наряду с 90% загрузкой ЦП.

Целью большинства языков программирования является не спасение вас, а предоставление вам инструментов для спасения себя. Вы можете написать плохой и раздутый код с утечками памяти на любом языке, в том числе с сборкой мусора. Сторонние инструменты обычно не так хорошо протестированы, как сама платформа. Веб-страницы, которые пытаются сделать слишком много, также не редкость.

Если вы хотите провести эксперимент, чтобы продемонстрировать это, приобретите Mac с Firefox и перейдите на хорошо написанный сайт, такой как 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?

Не все вычисления и действия в скрипте имеют визуальные проявления. Сценарий может выполнять некоторые вещи в фоновом режиме (например, запрашивать дополнительные материалы, предварительно извлекать вещи, просто ошибки), даже если вы этого не видите.

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

Речь идет о бухгалтерии. Подумайте о каждом предмете, который вы когда-либо одолжили (даже ручку) или о том, что кто-то одолжил у вас за всю вашу жизнь. Они все учтены? Утечки памяти происходят аналогичным образом (вы заимствуете память у системы), за исключением того, что вы передаете предметы. Затем посмотрите на вещи на вашем столе, вы оставили что-нибудь лежащим, потому что «вам это может понадобиться в ближайшее время», даже если вы, вероятно, не будете? та же история.

2 голосов
/ 14 апреля 2010
  • Почему утечки памяти так трудно найти и исправить?

Потому что некоторые разработчики отказываются использовать такие инструменты, как Electric Fence.

1 голос
/ 14 апреля 2010

Утечки памяти присутствуют, в первую очередь, потому что вы хотите хранить вещи в памяти, а не на диске. Например, предположим, у вас есть веб-страница с изображениями, CSS, JavaSript, текстом. Если для отображения страницы вы будете переходить на жесткий диск каждый раз, когда захотите использовать интерпретатор JavaScript, синтаксический анализатор CSS или механизм визуализации шрифтов для отображения текста, то браузер будет работать очень медленно и иногда не будет работать вообще (потому что для одной части JavaScript могут потребоваться переменные, которые, например, оставляются другой частью JavaScript). Таким образом, браузер пытается сохранить все данные, необходимые для его работы, в памяти, и эти вещи легко перекрестно ссылаются (вызов JavaScript в Adobe Flash, вызов Adobe Flash в JavaScript и т. Д.). И вы должны быть очень осторожны с такими ссылками на ресурсы, потому что преждевременная очистка и выход из строя приведет к нарушению кода (лучше сохранить ресурс, а не внезапно его умирать, поскольку его там нет).

P.S. См. Также эту статью для некоторых кровавых подробностей.

0 голосов
/ 14 апреля 2010

В Википедии есть статья о утечках памяти: http://en.wikipedia.org/wiki/Memory_leak

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...