Оперативное вмешательство: разбираемся с утечками памяти

Оперативной памяти много не бывает: любой доступный объём достаточен лишь «до поры, до времени», а там найдётся, куда его применить. Хорошо, когда это действительно полезные задачи. Работа. Игры. Исследования. Плохо, когда оперативка заканчивается не по вине пользователя, но по раздолбайству разработчика.

bnmrp1qbduu0aw2_hjvwg146u2a.jpeg

Причин тому много, способов же решения… давайте обо всём по порядку.

Верните мой 97-й


Незаконный захват оперативной памяти приложениями — прямое следствие технологического прогресса. Вычислительных ресурсов, спасибо закону Мура, становится больше (да и цена их падает год от года), а стоимость работы высококвалифицированного специалиста, увы (и вновь к счастью для нас, IT’шников), следует обратной динамике. Приложения обрастают новыми возможностями, для быстрой разработки вводятся очередные слои абстракций… Двадцать лет назад код был куда ближе к «железу», нежели сейчас. Огромное число прослоек и промежуточных технологий — одно из многих зол, приводящих к плачевной ситуации. 15 мегабайт оперативной памяти для (!) калькулятора. Кошмар!

87wgjnniziupxkuuzz84qgwf6ho.png

И ладно бы ситуация улучшалась, так нет: разработчики берут старые инструменты, придумывают еще более простые и многофункциональные новые, проходит несколько лет и цикл повторяется. Подумать только, недавно мы радовались CSS 3.0 и скругленным уголкам простым свойством объекта, затем Bootstrap’у, сейчас — очередной надстройке-комбайну. Write less, do more во все поля.

Комфортабельные троллейбусы из хлеба


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

Как бороться? Поставить какой-нибудь блокировщик рекламы и экстеншн типа The Great Suspender, который выгружает из памяти неиспользуемые страницы и сохраняет во вкладке «минимум» — удобно и эффективно снижает фоновый отжор памяти.

koxzp8qks6jomnc5ne1vbfda8_o.png

Не все adblock’и одинаково полезны


Да, софт, который вырезает назойливые баннеры и код всяких отслеживалок, в определенных случаях снижает нагрузку и на процессор, и на оперативку. Но не всегда. Эффективность данного решения зависит напрямую от качества его исполнения. Софт, работающий на уровне системы в роли прокси-сервера (отсекающий трафик с рекламных площадок до того, как он попадёт в браузер) сам по себе потребляет некоторый объём памяти, но он более-менее статичен. А вот расширения и модули для популярных браузеров создают монструозные конструкции на месте вырезанных рекламных фреймов. Да, рекламы на странице становится меньше, вот только потребление памяти данной вкладкой может вырасти не на каких-то 10–15%, а в несколько раз.

Проблемы кэширования ресурсов


Этим страдают в большинстве своём игры-песочницы, как стационарные, так и запускаемые внутри браузера: Factorio, Rim World, Minecraft с кучей модов… При определённом стечении обстоятельств (например, оставили производство на ночь, чтобы игра зарабатывала, пока вы спите) можно проснуться с наглухо повисшим компьютером. Ну или очень медленно работающим. При этом в плане оперативной памяти всё будет «ок» — сколько потребляла игра, столько и потребляет.

mtsvvihfceoln-zlg7lddmpp4ni.jpeg

В 90% случаев такого поведения у пользователей установлен SSD и включены одновременно файл подкачки и режим гибернации. Игра сбрасывает неиспользуемые ресурсы из оперативки в своп, «Винда» кэширует их и сохраняет на случай ухода в сон, далее графика используется повторно и вновь откладывается в «долгий ящик». Вот только старые копии никуда не удаляются — спустя несколько часов, в зависимости от объёма накопителя, свободное место на нём заканчивается, система падает до перезагрузки и очистки временных файлов. Не пытайся игра «оптимизировать» расход оперативной памяти, выгружая и вновь подкачивая ресурсы — текла бы как обычно, с постепенным замедлением работы и последующим крашем.

mboqiouwq5xves1o6m3xodwrjui.png

Варианты решения: проверка гипотезы какой-нибудь утилитой типа TreeSize, удаление накопленных мусорных asset’ов, перенос подкачки на объёмный HDD или отключение гибернации в Windows 10, написание багрепорта на форум, ожидание патча.

У разработчика лапки


Иногда утечки — это просто утечки. Фотошоп любит и умеет отжирать большие объёмы памяти, особенно сразу после выхода нового номерного релиза. Благо в самом приложении есть инструмент ограничения доступного объёма оперативки (не стоит выделять больше 66%), назначения кэширующих дисков и всего такого. В качестве альтернативы можно подождать полгода и дождаться стабильной версии. Киллерфичи редко бывают настолько нужны, чтобы мириться с багами.

ghwqjzhvewtmo6s3ep49cx_fyfm.jpeg

Торрент-клиенты. Множество одновременно установленных подключений, столько же одновременно скачиваемых файлов, проблемы с соединением — и соответствующий расход памяти. Решение — ограничение на количество исходящих соединений и скорости отдачи. Правильные коэффициенты подбираются вручную.

Софт принтеров / сканеров / камер. В анамнезе — написанный за еду индусский код: кривой, как камасутра. Медицина в этом случае бессильна — тут уж ибо использовать открытые / универсальные аналоги, либо писать багрепорты и молиться Шиве, чтоб тот покарал проклятых халтурщиков.

qi9h-4rysqr2x7qfkvyo1pdrfn0.jpeg

Майнер-малварь. Иногда утечка памяти «в никуда» — повод расчехлить антивирус. Главная защита криптовалют от «оптимизации» их добычи аппаратным методом — увеличение сложности алгоритма в направлении «нужно больше памяти для расчётов». Поэтому фоновые майнилки могут спалиться на потреблении оперативки. Причём приобщиться к числу «шахтёров» можно и незаметно для себя: чего стоит только известный скандал с uTorrent, «бонусом» к которому пользователи получали приложение-майнер Epic Scale. Да и один популярный трекер минувшей осенью засветился в фоновой добыче криптовалюты прямо в браузерах посетителей.

0aeada923f26b56ccf66fc1f24956752.jpg

Война без конца


Пройдёт ещё немало времени до того, как будет написан качественный ИИ, способный разгрести завалы кривого кода. А пока приходится бороться с утечками памяти проверенными методами: с бубном, плетью и багрепортом. Или наращивать объёмы и не замечать этих самых утечек. Конечно, иметь на борту 16, 32 или даже 64 гига быстрой оперативки — это хорошо, и у Kingston всегда найдётся подходящее решение. Важно помнить, что кривому софту любой объём не помеха — просто с хорошим запасом оперативной памяти он дольше проработает без проблем.

Есть интересные примеры утечек памяти в системе? Пишите в комментах — всем будет интересно.

© Geektimes