Electron-приложение может потреблять много памяти из-за нескольких окон, тяжелого renderer, утечек событий, неочищенных таймеров, кеша, больших данных в памяти или постоянных IPC-сообщений.
Сначала нужно понять, где растет память: main process, renderer process, hidden window, preload или отдельный сервис. Без этого легко оптимизировать не тот слой.
Коротко: что делать
- Снять показатели памяти main и renderer process
- Проверить, растет ли память после конкретного действия
- Посмотреть heap snapshots и listeners
- Проверить закрытие окон и очистку ресурсов
- Проверить, не хранятся ли большие списки данных в состоянии UI
Основные причины
У этой проблемы редко бывает одна универсальная причина. Обычно нужно проверить связку настроек, данных, кода и внешних сервисов, а потом уже выбирать способ исправления.
- Окна скрываются, но не уничтожаются
- Event listeners и таймеры не очищаются при переходах
- Renderer хранит слишком большой массив данных
- IPC передает тяжелые объекты слишком часто
- DevTools, кеш или webview удерживают ресурсы
Пошаговая диагностика
Диагностику лучше вести от конкретного примера: один пользователь, один запрос, один документ, одно событие или один экран. Так проще увидеть точку, где система начинает вести себя неправильно.
- Сравнить память после запуска, после действия и после возврата на экран
- Сделать heap snapshot до и после роста
- Проверить количество BrowserWindow и webContents
- Проверить подписки на события в React/Vue/vanilla JS
- Посмотреть нагрузку IPC и частоту обновлений
Как исправить проблему
Исправление должно закрывать корневую причину, а не только внешний симптом. Если проблема связана с доступами, платежами, данными или безопасностью, сначала стоит сделать резервную копию и проверить правку на тестовом сценарии.
- Освобождать окна, таймеры, listeners и subscriptions
- Виртуализировать большие списки и таблицы
- Ограничить кеш и размер данных в renderer
- Уменьшить частоту IPC и передавать только нужные поля
- Добавить профилирование памяти в сценарий тестирования
Безопасный план решения
Сначала найдите воспроизводимый сценарий роста памяти, затем снимите heap snapshot. Правка должна проверяться повторным прогоном этого же сценария.
Чего не стоит делать
- Не считать высокий расход памяти нормой только потому, что это Electron
- Не перезапускать приложение вместо исправления утечки
- Не хранить всю базу или большие файлы в состоянии интерфейса
- Не оставлять скрытые окна без контроля
Что подготовить перед исправлением
- Версия Electron и ОС
- Сценарий, после которого растет память
- Скрин process memory или heap snapshot
- Код окна или компонента, где проявляется рост
FAQ
Почему память растет после каждого открытия окна?
Скорее всего, окно или его обработчики не уничтожаются полностью.
Можно ли снизить память без переписывания приложения?
Часто да: очистить ресурсы, оптимизировать списки, уменьшить кеш и IPC.
Как проверить утечку?
Повторить одно действие много раз и сравнить heap snapshots до и после.
Когда стоит обратиться за помощью
Помощь нужна, если приложение используется клиентами, зависает на рабочих данных или расход памяти растет после каждого сценария.
Итог
Начните с heap snapshot и сценария роста памяти. Если нужно найти утечку в Electron-приложении и оптимизировать renderer/main process, можно написать в Telegram @rabotator_support.