Open-Club.Net Проект полностью ориентирован на Open Source-подход(изучаем, настраиваем, устанавливаем и общаемся о Linux).
Мы в соц. сетях:
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Как уменьшить расход памяти в Firefox
DiselДата: Вт, 14.07.2009, 19:20 | Сообщение # 1
Генерал-лейтенант
Группа: Бывалый
Сообщений: 489
Уже давно обращал внимание на тот факт, что после нескольких часов использования Firefox занимает несколько сотен мегабайт памяти, от 600 до 800 (RSS). Этим он толкал в своп другие приложения, что создавало неприятные задержки при переключении между приложениями. После брожения по инету в поисках "лекарства", пришел к следующим выводам. Многие из них не "вах какие открытия Америки", но, возможно, окажутся полезными:

1. Выключите все ненужные расширения
Ненужные расширения (add-ons) просто занимают кучу памяти. Качество расширений также варьируется, многие из них написаны неэффективно, расходуя и не освобождая память после использования.

У себя я выключил DownloadThemAll, Firebug, Flagfox, Image Zoom, Web Developer, YSlow - я понял, что не использую их так часто, как думал. Оставил AdBlock, BugMeNot, NoScript...

2. Удалите ненужные плагины
Ненужные плагины (plugins) также кушают много памяти. Плагины лучше удалять теми же способами, что и ставили, т.е. через менеджер пакетов. Так, у себя я обнаружил два десятка плагинов, включая Java, Citrix, DivX, Helix DNA, Kaffeine, mplayer, QuickTime, RealPlayer, Flash, VLC, Totem, Xine... больше половины из них никакой полезной нагрузки не несут, можно смело удалять... О Flash еще немного чуть попозже...

3. Контролируем расход памяти
В Firefox есть несколько настроек, контролирующих расход памяти:

Quote
browser.cache.memory.capacity

создатели Firefox уверяют, что по умолчанию Огнелис кушает максимум всего лишь 6.25% памяти на хранение кэша, во что верится очень слабо. Тем не менее, попрбуйте установить данный параметр в какое-нибудь число (в КБ) и посмотрите, как слушается Firefox. Если данный параметр не существует в about:config, то его можно создать с типом Integer.

Второй параметр:

Quote

browser.sessionhistory.max_total_viewers

он отвечает за количество сохраненных страниц в кэше, чтобы можно было быстро откатиться назад в браузере, без больших задержек. По умолчанию параметр установлен в -1, что означает автоматическую конфигурацию в зависимости от размера оперативной памяти (но не больше 8) - подробнее - в МозиллаЗин вики. Можете уменьшить количество сохраняемых страниц (я уменьшил до 5). Если вы считаете себя настоящим индейцем, можете установить параметр в 0, чтобы не сохранять страницы, с которых ушли :-) Хотя я неправ, настоящие индейцы используют lynx или links... ;-)

4. Сократите количество выполняемых скриптов в просматриваемых страницах
Установите расширение NoScript, которое будет блокировать выполнение Джава-скрипт, Флэш и Джава плагинов по умолчанию. К сожалению, нормальная работа со включенным NoScript превращяется в постоянное разрешение работы скриптов, поэтому можно порекомендовать вместо NoScript установить FlashBlock, который разрешает исполнение ДжаваСкрипт, но блокирует по умолчанию Флэш. А Флэш кушает много и очень много ресурсов, особенно под Linux (спасибо, Адоб... :-\)

5. Последний совет от матерых виндошников - регулярно перестартуйте Firefox
регулярный перезапуск Firefox позволяет избавиться от лишнего груза памяти, и компьютер начинает бегать заметно быстрее. Для этих целей даже написали специальное расширение: Restart Firefox

Приятного браузинга!


 
DiselДата: Вт, 14.07.2009, 20:50 | Сообщение # 2
Генерал-лейтенант
Группа: Бывалый
Сообщений: 489
Про выделение динамической памяти, или почему firefox так много памяти потребляет.

(Последний раз обновлено 24 августа 2006 года).
Всё началось с того, что все заметили, как много оперативной памяти кушает firefox. А также то, что он не возвращает её системе после закрытия всех открытых web-страниц.

Например, здесь с помощью функции malloc_stats() показано, что это не утечки памяти: https://bugzilla.mozilla.org/show_bug.cgi?id=324081#c17. А здесь это показано с помощью некой "leak-gauge tool" https://bugzilla.mozilla.org/show_bug.cgi?id=324081#c9.

Оказывается, что реализация malloc в glibc выделяет память в куче с помощью brk/sbrk, т.е. одним большим связным куском. Эта куча может уменьшаться только с конца, освободить память в середине невозможно (не считая вызова madvise). Так что даже один байт в конце кучи не позволяет отдать память системе. И malloc размещает переменные в памяти по сути просто друг за другом. Это создаёт условия для такого явления, как фрагментация памяти.

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

Можно использовать довольно простой аллокатор из OpenBSD-libc. Вообще-то, он был создан для другой цели, обеспечения безопасности -- защиты от ошибки переполнения буфера... но пришлось использовать его по причине отсутствия "навороченного" mmap-based аллокатора. Предварительная версия для ОС Linux может быть найдена здесь в виде готового файла (и здесь в виде патча к версии 1.83 из cvs). Собирать так: gcc -shared -fPIC -O2 OpenBSD_malloc_Linux.c -o malloc.so, запускать так: LD_PRELOAD=/path/to/malloc.so firefox.
Этот аллокатор можно использовать и с другими программами, но не со всеми работает (например, с emacs не работал, а также, говорят, с некоторыми сборками KDE). Но firefox почти у всех (и у меня всегда) работает.

В общем, ищется программист, который бы написал более навороченный (чем в OpenBSD) аллокатор.

Статистика аллокаций.
Количество аллокаций определённого числа байт показана здесь.
А вот более старая информация (с картинками!).

Объяснение явления.
1. Почему память не возвращается?
Ответ на этот вопрос очевиден--не все переменные удаляются, и некоторые из них "затыкают" кучу с конца.
2. Если закрыть все web-страницы, кроме одной, а затем продолжить использовать браузер, то почему потребление памяти снова растёт и растёт неограниченно--ведь в куче должно было остаться достаточно места от предыдущих web-страниц?
Из эксперимента ясно, что общий объём всех аллокаций в ~500M при 50M занятой памяти. Размер аллокаций разный--есть и в 20 байт, есть и в 4000 байт, причём малых аллокаций во много раз больше. Таким образом, если в куче появляется большая дырка, то она тут же занимается меньшими по сравнению с ней кусками, в промежутках между которыми набросано много совсем мелких кусков размером ~20 байт, некоторые из этих мелких кусков не удалятся--а это значит, что после того, как меньшие куски будут удалены, большая дырка разобъётся на несколько меньших дырок. Вспомнив, что такой процесс происходит порядка 500M/50M=10 раз, становится понятно, что используемая за время даже небольшого сеанса превращается в кашу, т.е. в куче аллокированные куски разделены небольшими промежутками, больших дырок в куче нет. А это значит, что когда firefox'у понадобится аллокировать большой кусок, то в куче для него не окажется достаточного промежутка, и прийдётся делать это расширяя всю кучу с помощью всё той же brk/sbrk.

Обе эти проблемы могут большей частью решены хорошим аллокатором, основанным на mmap.


 
  • Страница 1 из 1
  • 1
Поиск:
Новый ответ
Имя:
Текст сообщения:
Код безопасности: