Почему Monosnap зависает ваш компьютер и как это исправить
Вы в разгар рабочей сессии — IDE открыта, браузер с двадцатью вкладками, Slack запущен, возможно, Docker работает в фоновом режиме. Ваш компьютер начинает тормозить. Мышь дергается. Приложения откликаются через пять секунд. Вы открываете Диспетчер задач, и вот оно: Monosnap использует 800 MB, 1.2 GB, иногда более 2 GB ОЗУ.
Это не ошибка, о которой вы сообщили и ожидаете исправления. Это системная проблема, коренящаяся в архитектуре Monosnap. О ней сообщали пользователи годами, и она не была решена, потому что основная причина фундаментальна для того, как построен Monosnap.
Эта статья объясняет, почему это происходит, как это диагностировать, временные обходные пути и — когда вы устанете — постоянное решение.
Основная причина: Electron и утечки памяти
Monosnap построен на Electron, фреймворке, который запускает веб-приложения как десктопные, объединяя Chromium (движок, лежащий в основе Chrome) и Node.js. Каждое приложение Electron по сути запускает веб-браузер в фоновом режиме, поэтому приложения Electron, как правило, потребляют больше ресурсов, чем нативные приложения.
Сам по себе Electron не вызывает утечек памяти — хорошо разработанные приложения Electron эффективно управляют памятью. Но Electron упрощает появление утечек памяти и затрудняет их обнаружение. Сочетание сборки мусора JavaScript, конвейера рендеринга Chromium и цикла событий Node.js создает множество поверхностей, где может произойти утечка памяти.
В случае Monosnap, из отчетов пользователей и системного анализа выявляются несколько сообщенных паттернов утечек:
Накопление буфера изображений
Каждый скриншот, захваченный Monosnap, существует как буфер изображения в памяти. В хорошо реализованном инструменте эти буферы освобождаются после сохранения или загрузки изображения. В Monosnap отчеты пользователей предполагают, что буферы изображений из предыдущих захватов не полностью освобождаются, что приводит к росту памяти с каждым сделанным скриншотом. Сделайте 50 скриншотов за сессию, и у вас будет 50 частично сохраненных буферов изображений, потребляющих ОЗУ.
Раздувание процесса рендеринга
Приложения Electron используют процессы рендеринга (по сути, вкладки Chrome) для своего пользовательского интерфейса. Окна редактора, предварительного просмотра и настроек Monosnap работают как отдельные процессы рендеринга. Если эти процессы не очищаются должным образом при закрытии окон, выделенная им память сохраняется. В течение длительного сеанса с многократным открытием и закрытием редактора это накапливается.
Утечки обработчиков событий
Обработчики событий JavaScript, которые регистрируются, но никогда не отменяют регистрацию, являются классическим источником утечек памяти в приложениях Electron. Каждый обработчик удерживает ссылку, которая препятствует освобождению связанной памяти сборщиком мусора. В инструменте, который постоянно прослушивает глобальные горячие клавиши, изменения буфера обмена и события дисплея, даже небольшие утечки обработчиков со временем накапливаются.
Как диагностировать проблему
Если вы подозреваете, что Monosnap вызывает замедление работы вашей системы, вот как это подтвердить:
Проверка в Диспетчере задач
- Нажмите
Ctrl+Shift+Escчтобы открыть Диспетчер задач - Нажмите «Подробнее», если вы видите упрощенный вид
- Нажмите заголовок столбца «Память», чтобы отсортировать по использованию ОЗУ
- Ищите записи «Monosnap» — их может быть несколько (по одной на каждый процесс Electron)
- Запишите общий объем памяти, используемый всеми процессами Monosnap
Нормальное использование памяти для инструмента создания снимков экрана в режиме ожидания составляет 30-60 МБ. Если общий объем Monosnap превышает 300 МБ, у вас утечка. Более 500 МБ — это серьезно. Более 1 ГБ — это активно ухудшает работу вашей системы.
Подробный анализ в Мониторе ресурсов
Для получения более подробной информации откройте Монитор ресурсов (resmon из диалогового окна «Выполнить»):
- Перейдите на вкладку «Память»
- Найдите процессы Monosnap
- Проверьте «Рабочий набор» (фактически используемая физическая ОЗУ) и «Частный» (память, эксклюзивная для Monosnap)
- Наблюдайте за этими значениями в течение 30 минут обычного использования — если они имеют тенденцию к росту без создания вами снимков экрана, утечка подтверждена
Временные решения
Эти обходные пути устраняют симптомы. Они не устраняют основную утечку.
Регулярно перезапускайте Monosnap
Самое простое решение. Щелкните правой кнопкой мыши значок Monosnap в системном трее, выйдите и перезапустите. Это очищает всю накопленную память. Некоторые пользователи настраивают задание в Планировщике задач Windows для перезапуска Monosnap каждые несколько часов.
Отключите облачную синхронизацию
Функции облачной синхронизации Monosnap хранят дополнительные соединения и данные в памяти. Если вы не используете облачное хранилище, отключите его в настройках. Это не устранит утечки, но может снизить скорость роста памяти.
Уменьшите фоновую активность
Отключите функции, которые вы не используете: мониторинг буфера обмена, автоматический захват, плагины интеграции. Каждая активная функция добавляет обработчики событий и фоновые процессы, которые могут вызывать утечки.
Установите ограничение памяти с помощью Windows
Вы можете создать скрипт, который отслеживает использование памяти Monosnap и автоматически перезапускает его, когда оно превышает пороговое значение:
# PowerShell script — save as restart-monosnap.ps1
$threshold = 500MB
$process = Get-Process -Name "Monosnap" -ErrorAction SilentlyContinue
if ($process -and ($process.WorkingSet64 -gt $threshold)) {
Stop-Process -Name "Monosnap" -Force
Start-Sleep -Seconds 2
Start-Process "C:\Program Files\Monosnap\Monosnap.exe"
} Запланируйте запуск этого каждый час через Планировщик заданий. Это временное решение, но эффективное.
Постоянное решение: Переключитесь на нативное приложение
Постоянное решение проблемы утечек памяти в приложениях на базе Electron — прекратить использование таких инструментов. Нативные приложения для создания скриншотов, разработанные непосредственно на API операционной системы без среды выполнения веб-браузера, не имеют такой же поверхности для утечек памяти.
Maxisnap разработан нативно для Windows. Он не использует Electron, Chromium или Node.js. Он напрямую использует Windows API для захвата экрана, GDI+ для обработки изображений и легковесные UI-фреймворки для редактора аннотаций. Результат:
- ~35 MB ОЗУ в режиме ожидания — и остается на уровне ~35 MB. Без роста со временем. Без утечек.
- Менее 70 MB после установки — по сравнению с 200+ MB у Monosnap (большая часть из которых — встроенный Chromium)
- Ноль процессов Electron — один процесс в Диспетчере задач, предсказуемое использование ресурсов
- Перезагрузки не требуются — работает неделями без увеличения потребления памяти
Набор функций охватывает все, что нужно большинству пользователей Monosnap: захват области, захват всего экрана, 11 инструментов аннотирования (включая размытие для конфиденциальных данных) и загрузка через SFTP, FTP, S3 или HTTP. Смотрите полное сравнение.
Переход с Monosnap на Maxisnap
Переход занимает около пяти минут:
- Скачать Maxisnap — Менее 70 MB, устанавливается примерно за минуту
- Изучите горячие клавиши —
Ctrl+Alt+5(область),Ctrl+Alt+6(весь экран),Ctrl+Alt+7(автоматическая загрузка). Полное руководство по сочетаниям клавиш здесь. - Настройте загрузку (необязательно) — Если вы использовали облако Monosnap, настройте загрузку по SFTP на ваш собственный сервер для аналогичного рабочего процесса «захват-в-ссылку» без зависимости от облака Monosnap.
- Отключите запуск Monosnap — Настройки > Общие > снимите флажок «Запускать при старте системы»
- Включите запуск Maxisnap — Настройки > установите флажок «Запускать с Windows»
Ваши скриншоты из облака Monosnap остаются доступными через веб-интерфейс Monosnap даже после удаления настольного приложения. Новые скриншоты будут создаваться с помощью Maxisnap.
Почему эта проблема не будет решена
Утечки памяти в Electron, как известно, трудно исправить, потому что они распределены по слоям фреймворка. Утечка в процессе рендеринга требует иной отладки, чем утечка в основном процессе или слое Node.js. Поиск и устранение каждой утечки в сложном приложении Electron — это, по сути, постоянный проект, а не одноразовое исправление.
Команде Monosnap потребуется либо вложить значительные инженерные усилия в профилирование памяти и устранение утечек, либо переписать приложение без Electron. Ни то, ни другое, похоже, не входит в их планы, учитывая, что проблема сохраняется на протяжении нескольких основных версий.
Для пользователей это означает, что проблема не исчезнет. Вы можете управлять ею с помощью перезапусков и обходных путей, или вы можете устранить ее, переключившись на инструмент, который не несет на себе накладных расходов Electron.
Заключительные мысли
Инструмент для создания скриншотов должен быть незаметным. Он должен находиться в системном трее, потреблять незначительные ресурсы и захватывать ваш экран при нажатии горячей клавиши. Он не должен быть причиной зависания вашего компьютера во время презентации.
Если использование памяти Monosnap влияет на вашу работу, временные исправления, описанные выше, помогут. Но постоянное решение очевидно: используйте инструмент, созданный для этой задачи, без лишнего груза веб-браузера, работающего в фоновом режиме.
Скачать Maxisnap и сравните ваш Диспетчер задач до и после. Разница будет немедленной. Бесплатно для личного использования — попробовать можно бесплатно.