LINUX.ORG.RU

«Утечки» памяти в Firefox: официальный отчёт


0

0

Оказывается некоторые разработчики Mozilla Firefox до сих пор не знали(!) о печально известной ошибке, связанной с невозвращением выделенной оперативной памяти. Эта ошибка связана с тем, что выделяемая в процессе работы браузера память, запрашивается у ОС маленькими рядом идущими фрагментами, высвобождение отдельных из которых потом практически невозможно.

Stuart Parmenter предлагает несколько способов решения проблемы: выделение маленьких строк на стэке, а не в куче, выделение больших кусков памяти за один раз с дальнейшим распределением выделенного пространства под мелкие строки (как это уже сделано для layout objects) и т.д. В качестве последнего шага предлагается написать свою реализацию malloc/new, но Parmenter не считает что этим стоит заниматься, пока не опробованы другие способы.

"В качестве самой последней меры, мы могли бы полностью заменить malloc и new чем-то более лучшим. Я не думаю, что это стоит сейчас делать, пока мы не попробовали как можно больше других способов".

>>> Подробности

Ответ на: комментарий от KRoN73

> Вообще-то, уже.

Я сказал _средний_ для всех компьютеров. У меня в компании куча народа сидит на 512MB, новые компьютеры заказываются с 1GB, на 2GB перейдём совсем не скоро.

По моим оценкам, сейчас средний объём RAM равен примерно 768MB-1GB.

birdie ★★★★★
() автор топика
Ответ на: комментарий от Sherak

>Ждём когда девелоперы Фокса вслед за вайновцами откроют для себя Valgrind.

если они запустят лиса под valgrind'ом, то умрут от старости ещё до окончания рендеринга home page.

mirage
()
Ответ на: комментарий от gaa

>браузер mozilla — это переписанный _с нуля_ netscape. думаете, что со второго раза у них лучше выйдет?

фигня фиолетовая. то, что они постепенно заменяли куски, и в конце-концов все их заменили — допускаю. но если это называется «переписать с нуля», то я — внебрачный сын Торвальдса.

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

то есть: не будет никто ничего переписывать, пока оно окончательно не откажется работать на PC и не начнёт требовать для запуска кластера из суперкомпов.

mirage
()

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

Apocalepse
()
Ответ на: комментарий от anonymous

>> Поправьте, malloc и new - это не системные вызовы. Malloc - функция библиотеки C, а new - это оператор в C++.

>как ты думаешь, на чем реализован оператор new()?

Его можно переопределить. Там можно поставить условие - если чанк памяти меньше определенного размера, то использовать спецпул. Если больше - то пользоваться malloc(). Размер чанка выделенного под указатель в соответствии со стандартом С++ можно получить и в operator delete(), и задействовать симметричный способ удаления. У А. Александреску в библиотеке Loki есть класс Loki::SmallObject, который всю эту логику реализует.

Absurd ★★★
()
Ответ на: комментарий от Legioner

>Надо всё переписать на D!

Мысль очень дельная, ИМХО :) Правда, я не в курсе эффективности его GC.

KRoN73 ★★★★★
()

> Оказывается некоторые разработчики Mozilla Firefox до сих пор не знали(!)

4.2

anonymous
()
Ответ на: комментарий от iZEN

> Чего тут думать? JVM спасёт атцов русскай демократии! :))

В java слишком тормозная сборка мусора, да и переписывать придется код. Не лучше ли просто отказаться от free/delete? Память-то нынче такие гроши стоит, что подумать страшно.

anonymous
()
Ответ на: комментарий от anonymous

+ речь в статье идёт о FF 3 =>

s/"Утечки" памяти в Firefox: официальный отчёт/"Утечки" памяти в Firefox 3: официальный отчёт/

s/Оказывается некоторые разработчики Mozilla Firefox до сих пор не знали(!)/Разработчики Mozilla Firefox 3 не смогли обнаружить в коде места серьёзных утечек памяти/

anonymous
()
Ответ на: комментарий от gaa

откуда дровишки? афаик переписан там только интерфейс, а движок нетшкафовский

lester_dev ★★★★★
()
Ответ на: комментарий от lester_dev

> откуда дровишки? афаик переписан там только интерфейс, а движок нетшкафовский

ну а нетшкаф переписывался "from scratch" при переходе от версии 4.0 к 6.0. 5.0 не было, а сам переход занял 3 года

gaa ★★
()
Ответ на: комментарий от lester_dev

>откуда дровишки? афаик переписан там только интерфейс, а движок нетшкафовский

Пытался думать мозгом ? (верхним) Вспомни на чем остановилось развитие NN, и то что сейчас умеет FF. Общие куски кода наверняка есть, но полагаю их мало, и тормозят скорее всего не они. NN был вполне быстрым браузером для своего времени.

anonizmus
()
Ответ на: комментарий от anonizmus

сам мозг включи. с чего бы это последний нетшкаф совместим с фоксом вплоть до расширений если разные движки?

lester_dev ★★★★★
()
Ответ на: комментарий от anonizmus

если учесть, что NN тоже использует gecko, то откуда будет "мало" общих частей, если ядро одно?

Reset ★★★★★
()
Ответ на: комментарий от Reset

> зачем нужен ff когда есть opera и konqueror, лишенные этих недостатков?

оперу портировали на amd64? в опере и конквероре появился аналог firebug? в конквероре появились imglikeopera?

gaa ★★
()
Ответ на: комментарий от gaa

64-bit builds у Оперы давно уже есть. это боянЪ.

wtf is firebug? js-debugger? увы. тут у Оперы всё плохо. что, впрочем, лично мне никак не мешает делать скрипты по 100 кил и прекрасно их отлаживать. под Оперой.

mirage
()
Ответ на: комментарий от mirage

> 64-bit builds у Оперы давно уже есть. это боянЪ.

спасибо, не знал

> wtf is firebug? js-debugger? увы. тут у Оперы всё плохо. что, впрочем, лично мне никак не мешает делать скрипты по 100 кил и прекрасно их отлаживать. под Оперой.

да. плюс ещё инспектор(и редактор) DOM-дерева, отладчик ajax-запросов... в общем, удобная вещь для отладки приложений, завязанных на ajax-е.

gaa ★★
()

Утечки? Какие утечки? Быдлу просто объяснят что ему нужно купить больше памяти.

anonymous
()
Ответ на: комментарий от KRoN73

>Вообще-то, уже. 512Мб - это сегодня даже в России самый лоуэнд. Я со своим 1Гб на домашние машине - и то уже "нищий" :)

ой дурак(с)

anonymous
()
Ответ на: комментарий от anonymous

>Утечки? Какие утечки? Быдлу просто объяснят что ему нужно купить больше памяти.

А небыдлу браузер не нужен.

Absurd ★★★
()
Ответ на: комментарий от Absurd

>> Утечки? Какие утечки? Быдлу просто объяснят что ему нужно купить больше памяти.

> А небыдлу браузер не нужен.

небыдло ходит на ЛОР netcat-ом и рендерит странички в уме?

gaa ★★
()
Ответ на: комментарий от gaa

>>> Утечки? Какие утечки? Быдлу просто объяснят что ему нужно купить больше памяти.

>> А небыдлу браузер не нужен.

>небыдло ходит на ЛОР netcat-ом и рендерит странички в уме?

ЛОР нормально и в lynx выглядит. Как и большинство Linux/BSD/UNIX ресурсов. Хотя я все-таки нетру, то есть быдло.

Absurd ★★★
()
Ответ на: комментарий от gaa

>спасибо, не знал

ну, и я погорячился. не «давно», а «с момента выхода альфы Kestrel'а». %-)

>да. плюс ещё инспектор(и редактор) DOM-дерева, отладчик ajax-запросов… в общем, удобная вещь для отладки приложений, завязанных на ajax-е.

по-моему, всё это есть в Opera Developer Tools. мне хватает:

devTools (скрипт)

Mouseover DOM Inspector (после напильника) (скрипт)

JavaScript Console (вмонтировано в Оперу)

JK JavaScript Console (Jupiter JS Console, скрипт, после напильника)

чего нет — это пошагового выполнения JS. но я и gdb как-то не использую, всё по старинке: логами да принтами… %-)

mirage
()
Ответ на: комментарий от gaa

>оперу портировали на amd64?

портировали

>в конквероре появились imglikeopera?

Че это такое? Кнопка "загрузить картинки" чтоль? Всегда было.

> в опере и конквероре появился аналог firebug?

не все тут вебдевелоперы

Reset ★★★★★
()
Ответ на: комментарий от mirage

>> да. плюс ещё инспектор(и редактор) DOM-дерева, отладчик ajax-запросов… в общем, удобная вещь для отладки приложений, завязанных на ajax-е.

> по-моему, всё это есть в Opera Developer Tools.

то есть там можно навести мышу на какой-либо элемент и получить сразу соответствующую ноду из dom-дерева?

моэно видеть, какие именно в данный момент идут запросы и видеть их параметры?

можно редактировать "на лету" содержимое страницы?

PS. я не придираюсь, я действительно не знаю, есть ли это в опере

gaa ★★
()
Ответ на: комментарий от Reset

>>в конквероре появились imglikeopera?

> Че это такое? Кнопка "загрузить картинки" чтоль? Всегда было.

возможность переключения между грузить/не грузить/грузить только из кеша. удобно при нежелании тянуть лишнюю графику.

>> в опере и конквероре появился аналог firebug?

> не все тут вебдевелоперы

я для себя спрашиваю, из-за этих фич пришлось на огнелиса уходить.

gaa ★★
()
Ответ на: комментарий от gaa

>то есть там можно навести мышу на какой-либо элемент и получить сразу соответствующую ноду из dom-дерева?

да. точнее, так: наводим крыс, делаем «клац» — devTool вежливо открывает дерево у себя в окошке и позиционируется на нужный элемент. для того, чтобы не тащить комбайн (я часто делаю простые «чистилки» страниц в 5–8 XPath-запросов) есть MODI — скрипт на 30 кил, без дерева, но иногда удобен.

>моэно видеть, какие именно в данный момент идут запросы и видеть их параметры?

вот тут не уверен. что-то такое есть — XHR logger с кучей опций — но я его не юзал (не надо пока). вроде, однажды пробовал — работает, лог делает.

>можно редактировать «на лету» содержимое страницы?

не совсем. можно чуть-чуть «корябать» DOM. плюс — в MODI есть «edit html of this node». то есть, в принципе, можно.

>PS. я не придираюсь, я действительно не знаю, есть ли это в опере

да я по тону понял. вот, отвечаю в меру сил. %-)

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

mirage
()
Ответ на: комментарий от gaa

>>> один еврей нашептал, Joel Spolsky.

Тот самый которого выгнали мелко-мягкие?

anonymous
()
Ответ на: комментарий от lester_dev

>сам мозг включи. с чего бы это последний нетшкаф совместим с фоксом вплоть до расширений если разные движки?

насколько я помню, мозилловцы полностью переписали движек со времен нетшкафа 4, а нетшкаф 6 уже основан на этом полностью переписаном движке.

wieker ★★
()

ща вот как перелезу на нетскейп ! будете знать

anonymous
()
Ответ на: комментарий от gaa

not at all. это не firebug, конечно, но инструмент вполне достойный, имо.

единственно что стоит — это стянуть скрипт на локалхост. анноит, что оно каждый раз на сайт оперы за ним лезет.

зыж если кто ещё заинтересовался — http://dev.opera.com/articles/view/opera-developer-tools/

страница датирована концом 2006, но сам скрипт активно развивают (потому и ставят по дефолту «брать с сайта оперы»).

mirage
()
Ответ на: комментарий от wieker

>насколько я помню, мозилловцы полностью переписали движек со времен нетшкафа 4, а нетшкаф 6 уже основан на этом полностью переписаном движке.

да. пятого никогда не было (туда планировали вставить Marine), а шестой — уже на змеюке.

mirage
()

Кто-нибудь может объяснить что плохого в том чтобы написать свой "умный" malloc()? ведь это должно быть значительно проще чем изменять весь код

anonymous
()
Ответ на: комментарий от anonymous

>Кто-нибудь может объяснить что плохого в том чтобы написать свой "умный" malloc()? ведь это должно быть значительно проще чем изменять весь код

it's not sexy

wieker ★★
()
Ответ на: комментарий от anonymous

>Кто-нибудь может объяснить что плохого в том чтобы написать свой "умный" malloc()? ведь это должно быть значительно проще чем изменять весь код

Чтобы улучшить перформанс/использование памяти надо всегда быть более специфичным, и подходить индивидуально к каждому случаю. Типа "А на что пойдет память в данном контексте, и когда ее можно будет удалить?". Применительно к Мозилле надо наверно иметь по пулу памяти на каждую страницу и при закрытии освобождать сразу большой непрерывный кусок. Это как минимум, в реале гранулярность должна быть еще выше. Возможно, ее надо дефрагментировать - тогда надо использовать вместо указателей хендлы и когда кусок памяти не используется (счетчик локингов == 0) его можно двигать вплонтую к другому занятому блоку, выдавливая "воздух" в большой непрерывный блок - это можно сделать в каком-нибудь хандлере onIdle. Но в таком большой проекте как Мозилла это было бы безумие, к тому же приоритеты задаются менеджерами.

Absurd ★★★
()

Тут пару раз поднимался вопрос о переписывании кода с нуля.

Давайте разберемся. Что тормозит и жрет память?

Gecko? Есть WebKit (который с точки зрения кода выглядит значительно лучше). Тут интересен Midori - морда для вебкита, которая пишется с нуля (и причем вменяемым человеком) и уже сейчас вполне похожа на браузер (скриптуемость на Lua из коробки).

XUL? Не пользуйтесь Firefox, есть много других браузеров на Gecko - понимающий многие расширения последнего Epiphany, а также новомодный Kazehakaze.

anonymous
()
Ответ на: комментарий от KRoN73

> Можно своп совсем выключать...

У меня 1G, свапа нет. Забыл при установке сделать. :) Никаких проблемы не наблюдал.

atrus ★★★★★
()
Ответ на: комментарий от atrus

>> Можно своп совсем выключать...

> У меня 1G, свапа нет. Забыл при установке сделать. :) Никаких проблемы не наблюдал.

на 512 мб наблюдал только проблему с тем, что sh -c ':(){:&:};:' валил систему много раньше чем с одним гигом

gaa ★★
()
Ответ на: комментарий от gaa

> на 512 мб наблюдал только проблему с тем, что sh -c ':(){:&:};:' валил систему много раньше чем с одним гигом

Это надежда на то, что запущу? ;-) За кого меня принимают... Неужели кто-то с четырьмя звездами до сих пор не выучил bash? ;-)))

atrus ★★★★★
()

[birdie@localhost ~]$ sh -c ':(){:&:};:'
sh: -c: line 0: syntax error near unexpected token `{:'
sh: -c: line 0: `:(){:&:};:'

birdie ★★★★★
() автор топика
Ответ на: комментарий от birdie

Получилось запустить такое sh -c 'a(){ a& };a'

Но оно не пашет: sh[29093]: segfault at bf496fac eip b7d8c31f esp bf496fb0 error 6

birdie ★★★★★
() автор топика
Ответ на: комментарий от birdie

> [birdie@localhost ~]$ sh -c ':(){:&:};:'
> sh: -c: line 0: syntax error near unexpected token `{:'
> sh: -c: line 0: `:(){:&:};:'

знакомый гентушнег запускал, потом прислал мне смс, что я злодей. наверно для этой форкбомбы особые USE-флаги нужны...

gaa ★★
()
Ответ на: комментарий от anonymous

Эта фигня должна была плодить в бесконечном цикле процессы sh, но она этого не делает.

birdie ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.