index / guides / firefox-memory

Firefox: Полное руководство по управлению памятью и диском

Детальный разбор работы Firefox с RAM и диском: архитектура процессов, about:memory, управление вкладками, кэш, swap, GC и оптимизация

Firefox: Полное руководство по управлению памятью и диском

Введение

Firefox — один из самых гибких браузеров в плане управления ресурсами. В отличие от Chrome, который создаёт отдельный процесс для каждой вкладки, Firefox использует более сложную и настраиваемую архитектуру. В этой статье разберём как Firefox работает с RAM и диском, и как оптимизировать его под свои нужды.

Архитектура процессов Firefox

Типы процессов

Firefox использует многопроцессную архитектуру (Electrolysis/e10s):

about:processes

Parent Process (главный)
├── Web Content (вкладки, по умолчанию 8 процессов)
├── WebExtensions (расширения)
├── GPU Process (графика)
├── RDD Process (декодирование медиа)
├── Socket Process (сеть)
└── Utility Process (вспомогательный)

Настройка количества процессов контента

Откройте about:config и найдите:

dom.ipc.processCount = 8          // макс. процессов для вкладок
dom.ipc.processCount.webIsolated = 4   // процессов для изолированных сайтов
fission.autostart = true          // изоляция по сайтам (Site Isolation)

Совет: Если у вас мало RAM (≤8GB), уменьшите dom.ipc.processCount до 4. Это снизит потребление памяти, но вкладки будут влиять друг на друга.

Мониторинг: about:memory

Главный инструмент диагностики памяти в Firefox — страница about:memory.

Основные функции

about:memory — Кнопки

Measure              — снять текущий снимок памяти
Free memory          — принудительная очистка (GC + CC + minimize)
GC                   — запустить Garbage Collection
CC                   — запустить Cycle Collection
GC + CC              — запустить оба сборщика
Minimize memory use  — агрессивная минимизация памяти
Save reports         — сохранить отчёт в JSON

Чтение отчёта

После нажатия “Measure” вы увидите дерево памяти:

Пример вывода about:memory

Main Process
├── explicit                    // явно выделенная память
│   ├── heap-allocated         // куча
│   │   ├── js                 // JavaScript память
│   │   │   ├── zone          // JS зоны
│   │   │   └── gc-heap       // GC куча
│   │   ├── images            // изображения
│   │   └── media             // аудио/видео буферы
│   └── non-heap              // не-куча (mmap и т.д.)
├── resident                   // физическая RAM
├── vsize                      // виртуальная память
└── resident-unique            // уникальная память процесса

Web Content (pid 12345) [https://example.com]
├── explicit/window-objects    // DOM объекты
├── explicit/js-non-window     // JS вне окон
└── ...

Ключевые метрики

МетрикаОписание
residentРеальное использование физической RAM
heap-allocatedВыделено в куче (malloc)
js/gc-heapПамять JavaScript — часто главный потребитель
imagesДекодированные изображения
resident-uniqueПамять, не разделяемая с другими процессами

Мониторинг: about:processes

Более наглядный способ увидеть потребление по вкладкам:

about:processes — колонки

Name          — имя процесса/вкладки
Type          — тип (web, extension, gpu...)
Memory        — текущее потребление RAM
Threads       — количество потоков
CPU (%)       — загрузка процессора

Совет: Кликните на вкладку в about:processes — можно закрыть зависший процесс без закрытия всего браузера!

Управление вкладками

Tab Unloading (выгрузка вкладок)

Firefox автоматически выгружает неактивные вкладки при нехватке памяти:

about:config — Tab Unloading

browser.tabs.unloadOnLowMemory = true    // включить выгрузку
browser.low_commit_space_threshold_mb = 200  // порог свободной памяти
browser.low_commit_space_threshold_percent = 5  // или в процентах

Приоритеты вкладок

Firefox выгружает вкладки по приоритету:

  1. Вкладки, которые давно не посещались
  2. Вкладки без аудио/видео
  3. Вкладки без форм с введёнными данными
  4. Вкладки, не закреплённые (pinned)

Ручная выгрузка

Правый клик на вкладке → Unload Tab (в новых версиях Firefox 105+)

Или через консоль браузера (Ctrl+Shift+J):

// Выгрузить текущую вкладку
gBrowser.discardBrowser(gBrowser.selectedTab);

// Выгрузить все фоновые вкладки
for (let tab of gBrowser.tabs) {
  if (!tab.selected) gBrowser.discardBrowser(tab);
}

Расширения для управления вкладками

  • Auto Tab Discard — автовыгрузка по таймеру
  • Tab Suspender — приостановка вкладок
  • OneTab — сворачивание всех вкладок в список

Дисковый кэш

Настройки кэша

Firefox кэширует данные на диск для ускорения загрузки:

about:config — Disk Cache

browser.cache.disk.enable = true          // включить дисковый кэш
browser.cache.disk.capacity = 1048576     // размер в КБ (1GB)
browser.cache.disk.smart_size.enabled = true  // автоматический размер
browser.cache.disk.parent_directory = ""  // путь к кэшу (по умолчанию профиль)

Перенос кэша на RAM-диск

Для SSD или для скорости можно переместить кэш в RAM:

Linux — tmpfs:

# /etc/fstab
tmpfs /tmp/firefox-cache tmpfs nodev,nosuid,size=512M 0 0

# about:config
browser.cache.disk.parent_directory = "/tmp/firefox-cache"

Windows — ImDisk:

:: Создать RAM-диск R: размером 512MB
imdisk -a -s 512M -m R: -p "/fs:ntfs /q /y"

:: about:config
browser.cache.disk.parent_directory = "R:\\firefox-cache"

Только RAM-кэш (без диска)

about:config

browser.cache.disk.enable = false         // отключить диск
browser.cache.memory.enable = true        // включить память
browser.cache.memory.capacity = 524288    // 512MB в КБ
// -1 = автоматически определить размер

Контроль Swap

Почему Firefox уходит в swap?

Firefox может занимать много виртуальной памяти, даже если не использует её активно. Система может выгрузить неактивные страницы в swap.

Linux: настройка swappiness

# Текущее значение (по умолчанию 60)
cat /proc/sys/vm/swappiness

# Уменьшить агрессивность swap (0-100)
sudo sysctl vm.swappiness=10

# Постоянно — /etc/sysctl.conf
vm.swappiness=10

Linux: cgroups для ограничения памяти Firefox

# Запустить Firefox с лимитом 4GB RAM
systemd-run --user --scope -p MemoryMax=4G firefox

# Или создать сервис
# ~/.config/systemd/user/firefox-limited.service
[Service]
MemoryMax=4G
ExecStart=/usr/bin/firefox

Windows: Process Lasso / System settings

В Windows нет прямого контроля swap для процесса, но можно:

  • Увеличить pagefile
  • Использовать Process Lasso для приоритезации
  • Ограничить Working Set через PowerShell
# Принудительно сбросить рабочий набор Firefox
$firefox = Get-Process firefox
foreach ($p in $firefox) {
  [System.Runtime.InteropServices.Marshal]::
    SetProcessWorkingSetSize($p.Handle, -1, -1)
}

Session Restore и диск

Как работает восстановление сессии

Firefox периодически сохраняет состояние всех вкладок на диск:

~/.mozilla/firefox/[profile]/
├── sessionstore.jsonlz4        // текущая сессия (сжатый JSON)
├── sessionstore-backups/
│   ├── recovery.jsonlz4       // последний автосейв
│   ├── recovery.baklz4        // предыдущий автосейв
│   ├── previous.jsonlz4       // предыдущая сессия
│   └── upgrade.jsonlz4-*      // бэкап перед обновлением

Настройки автосохранения

about:config

browser.sessionstore.interval = 15000     // интервал сохранения (мс)
browser.sessionstore.max_tabs_undo = 25   // макс. закрытых вкладок
browser.sessionstore.max_windows_undo = 3 // макс. закрытых окон
browser.sessionstore.privacy_level = 0    // 0=всё, 1=без https, 2=никогда

Совет: Увеличьте browser.sessionstore.interval до 60000 (1 минута) чтобы снизить нагрузку на диск, особенно на SSD.

Garbage Collection

Как работает GC в Firefox

SpiderMonkey (JS-движок Firefox) использует инкрементальный сборщик мусора:

  • Incremental GC — сборка по частям, без долгих пауз
  • Generational GC — разделение на молодое/старое поколение
  • Compacting GC — дефрагментация памяти

Настройки GC

about:config

javascript.options.mem.gc_incremental = true     // инкрементальный GC
javascript.options.mem.gc_per_zone = true        // GC по зонам
javascript.options.mem.gc_incremental_slice_ms = 5  // макс. пауза (мс)
javascript.options.mem.high_water_mark = 128     // порог для GC (MB)
javascript.options.mem.gc_allocation_threshold_mb = 30  // GC после выделения

Cycle Collection

Cycle Collector освобождает циклические ссылки между JS и DOM:

about:config

dom.cycle_collector.incremental = true   // инкрементальный CC
javascript.options.mem.gc_compacting = true  // включить компактинг

Firefox Profiler

Для глубокого анализа используйте встроенный профилировщик:

Запуск профилировщика

1. Откройте about:profiling
2. Или установите расширение Firefox Profiler
3. Или нажмите Ctrl+Shift+1 (если включено)

Выберите пресет:
- Nightly: полный анализ
- Web Developer: фокус на JS
- Media: аудио/видео
- Memory: утечки памяти

Memory профилирование

about:profiling — Memory preset

Features to enable:
☑ Memory Track Allocations  — отслеживание выделений
☑ Native Allocations        — нативные выделения
☑ Memory Pressure           — события нехватки памяти

Записать → Остановить → Анализ на profiler.firefox.com

Оптимизация для слабых машин

Профиль “минимальное потребление”

about:config — Low Memory Profile

// Процессы
dom.ipc.processCount = 2
fission.autostart = false

// Кэш
browser.cache.memory.capacity = 65536    // 64MB
browser.cache.disk.capacity = 262144     // 256MB

// Сессия
browser.sessionstore.interval = 120000   // 2 минуты
browser.sessionstore.max_tabs_undo = 5

// GC агрессивнее
javascript.options.mem.high_water_mark = 64
javascript.options.mem.gc_allocation_threshold_mb = 15

// Выгрузка вкладок
browser.tabs.unloadOnLowMemory = true
browser.low_commit_space_threshold_mb = 400

// Изображения
image.mem.decode_bytes_at_a_time = 16384
gfx.webrender.all = false   // отключить WebRender на слабом GPU

Решение проблем

Firefox потребляет слишком много RAM

  1. Откройте about:processes — найдите прожорливую вкладку
  2. Откройте about:memory → “Minimize memory usage”
  3. Проверьте расширения — отключите по одному
  4. Очистите кэш: Settings → Privacy → Clear Data
  5. Создайте новый профиль: firefox -P

Утечки памяти

Диагностика утечек

1. about:memory → Measure (запомните значения)
2. Подождите 10-15 минут, не закрывая вкладки
3. about:memory → Measure (сравните)
4. Если explicit/js растёт — утечка в JS
5. Если explicit/images — утечка в изображениях
6. Сохраните отчёт и отправьте в bugzilla.mozilla.org

Медленный старт Firefox

  • Отключите “Restore previous session” если много вкладок
  • Используйте about:profiles для создания чистого профиля
  • Проверьте about:performance на медленные расширения

Шпаргалка команд

Полезные about: страницы

about:memory       — детальное использование памяти
about:processes    — процессы и вкладки
about:performance  — производительность вкладок
about:config       — все настройки
about:support      — системная информация
about:networking   — сеть и DNS
about:cache        — статистика кэша
about:profiling    — профилировщик

Горячие клавиши

Shift+Esc          — Диспетчер задач Firefox
Ctrl+Shift+J       — Browser Console
Ctrl+Shift+M       — Responsive Design Mode
Ctrl+Shift+P       — Приватное окно
Ctrl+Shift+Del     — Очистить данные

Заключение

Firefox предоставляет огромное количество инструментов для контроля памяти. Используйте about:memory для диагностики, настройте about:config под свои нужды, и Firefox будет работать эффективно даже на слабых машинах.

Bookmark’ните эту статью — пригодится при отладке!