Добей зомби, помоги лисичке

в 12:25, , рубрики: Firefox, Веб-разработка, метки:

Добей зомби, помоги лисичке
Браузер Firefox имеет устоявшуюся репутацию агрессивного пожирателя памяти из-за постоянных проблем с утечками. С новым патчем от Kyle Huey эта проблема может быть в основном решена. Но давайте начнем с начала.

В Firefox память, выделяемая с использованием JavaScript`а разделяется на ячейки (compartments). Грубо говоря, вся память используемая JavaScript`ом из одного источника (например, из одного сайта) выделяется в одной ячейке. Память используемая JavaScript`ом непосредственно Firefox`а тоже занимает одну или несколько ячеек. Использование такого приема улучшает безопасность и локальность памяти.

Начиная с Firefox 13 можно посмотреть используемые ячейки памяти на страничке “about:compartments”. Вот, например, какие ячейки памяти задействованы, если открыта главная страница хабра.

Добей зомби, помоги лисичке

Когда вы закрываете страницу, все ассоциированные с ней ячейки должны исчезнуть. Ну, может быть не сразу, а когда сработают сборщик мусора и сборщик циклических ссылок (cycle collector). Иногда, из-за багов в аддонах или самом Firefox`e, ячейки не удаляются и остаются висеть в памяти в качестве зомби-ячеек (zombie compartments). Это и приводит к увеличению объема потребляемой браузером памяти и увеличивает вероятность падения программы. Печально.

Но на помощь лисоводам уже спешит смелый и добрый Кайл Хуэей (Kyle Huey), который написал патч, устраняющий появление зомби-ячеек для большинства ситуаций (патч уже доступен в nightly build`ах Firefox). Применение этого патча снижает потребление памяти в несколько раз (в зависимости от того, сколько конкретно плагинов с утечками вы использовали). Это, наконец-то, делает возможным использование последних версий Firefox на не самых мощных машинах (вроде устройств с полугигабайтом памяти). Но даже если ваша жизнь хороша и у вас 16GB RAM, этот патч все равно ускорит лису, так как сократит частоту запуска сборщика мусора и сборщика циклических ссылок. А эти двое работают в эксклюзивном режиме, заставляя всю программу замирать, пока они не закончат.

Однако не все так радужно. Патч Кайла устранил множество утечек в аддонах, но открыл утечку в Addon SDK. В версии 1.6.1 это уже поправлено, но, если ваш любимый аддон создан с применением более ранней версии SDK, то есть повод написать письмо разботчикам, чтобы не получилось еще большей утечки как у Wallflower, аддона для удаления кнопок Facebook и “+1”.

Как можно заметить охота на оставшиеся зомби-ячейки находится в самом разгаре и вы можете в ней поучаствовать. Для этого:
— Открываем в лисице (более-менее современной версии) страницу about:memory?verbose.
— Открываем тестируемую страницу с подозрительными скриптами и плагинами и находим, сколько памяти она использует. Например, для главной страницы хабра:

│ ├───3,579,160 B (05.06%) — compartment(http://habrahabr.ru/)
│ │ ├──1,642,496 B (02.32%) — gc-heap
│ │ │ ├────514,680 B (00.73%) — shapes
│ │ │ │ ├──239,560 B (00.34%) ── tree
│ │ │ │ ├──230,880 B (00.33%) ── dict
│ │ │ │ └───44,240 B (00.06%) ── base
│ │ │ ├────489,120 B (00.69%) — arena
│ │ │ │ ├──460,712 B (00.65%) ── unused
│ │ │ │ ├───15,576 B (00.02%) ── padding
│ │ │ │ └───12,832 B (00.02%) ── headers
│ │ │ ├────369,104 B (00.52%) — objects
│ │ │ │ ├──210,656 B (00.30%) ── function
│ │ │ │ └──158,448 B (00.22%) ── non-function
│ │ │ ├────166,136 B (00.23%) ── scripts
│ │ │ ├─────88,608 B (00.13%) ── type-objects
│ │ │ └─────14,848 B (00.02%) ── strings
│ │ ├────692,000 B (00.98%) — type-inference
│ │ │ ├──329,216 B (00.47%) ── script-main
│ │ │ ├──295,520 B (00.42%) ── object-main
│ │ │ └───67,264 B (00.10%) ── tables
│ │ ├────456,328 B (00.64%) ── script-data
│ │ ├────327,680 B (00.46%) — mjit
│ │ │ └──327,680 B (00.46%) ── code
│ │ ├────260,224 B (00.37%) — shapes-extra
│ │ │ ├──104,992 B (00.15%) ── tree-tables
│ │ │ ├───97,024 B (00.14%) ── dict-tables
│ │ │ ├───31,328 B (00.04%) ── tree-shape-kids
│ │ │ └───26,880 B (00.04%) ── compartment-tables
│ │ ├────103,440 B (00.15%) — objects
│ │ │ ├──100,224 B (00.14%) ── slots
│ │ │ ├────3,008 B (00.00%) ── elements
│ │ │ └──────208 B (00.00%) ── misc
│ │ ├─────90,016 B (00.13%) ── analysis-temporary
│ │ └──────6,976 B (00.01%) ── string-chars

— Закрываем подозрительную страницу и нажимаем внизу кнопку “Minimize memory usage” (несколько раз для надежности). Это приводит к срабатыванию сборщика мусора и сборщика циклических ссылок и соответствующая ячейка должна исчезнуть. Если этого не происходит, то скорее всего она — зомби.
— Проверяем через 10-20 минут — некоторые зомби живут какое-то время, а некоторые — бессмертны.
— Пробуем выяснить какой скрипт или аддон вызывает появление зомби.
— Постим баг в багзиллу, не забывая добавить в описание “[MemShrink]” и приаттачить вывод about:memory?verbose.

Удачной охоты на зомби и берегите свои мозги!

Автор: terrier

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js