Performance.memory: примеры (JAVASCRIPT)

Использование performance.memory для анализа памяти в браузере
Раздел: Производительность, Память
performance.memory: Object (with jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize)

Основные сведения о performance.memory

Свойство performance.memory является частью JavaScript Performance API в браузерах на движке V8 (например, Google Chrome). Оно предоставляет разработчику доступ к данным об использовании памяти веб-страницей. Это свойство используется для мониторинга и отладки производительности приложений, позволяя отслеживать потребление памяти в процессе выполнения скриптов.

Объект performance.memory доступен только для чтения и содержит несколько полей, описывающих состояние памяти:

  • jsHeapSizeLimit: Максимальный размер кучи JavaScript (в байтах), которую может использовать контекст.
  • totalJSHeapSize: Общий размер выделенной кучи JavaScript (в байтах).
  • usedJSHeapSize: Размер используемой части кучи JavaScript (в байтах). Если значение usedJSHeapSize превышает totalJSHeapSize, это может указывать на фрагментацию памяти.

Свойство не принимает аргументов и возвращает объект MemoryInfo. Использование этого API может быть ограничено настройками браузера или политиками безопасности.

Примеры использования

Простейший способ получить информацию о памяти — прямой доступ к свойству.

console.log(performance.memory);
MemoryInfo {
  jsHeapSizeLimit: 4294705152,
  totalJSHeapSize: 12345678,
  usedJSHeapSize: 8765432
}

Можно отслеживать изменение памяти после выполнения операций.

const memoryBefore = performance.memory.usedJSHeapSize;
// Создание большого массива
const arr = new Array(1000000).fill('test');
const memoryAfter = performance.memory.usedJSHeapSize;
console.log(`Потребление памяти: ${memoryAfter - memoryBefore} байт`);
Потребление памяти: 8000000 байт

Альтернативы в JavaScript

В веб-разработке существует несколько подходов для мониторинга памяти:

  • PerformanceObserver: API для наблюдения за различными метриками производительности, включая записи типа memory, но на данный момент наблюдение за памятью через этот API не стандартизировано для всех браузеров.
  • process.memoryUsage(): Доступно в среде Node.js. Возвращает объект с данными об использовании памяти процессом, включая heapUsed, heapTotal и rss. Этот метод более точен для серверной стороны.
  • window.performance: Общий API для сбора различных метрик производительности, таких как время загрузки ресурсов, но не предоставляет детальной информации о памяти без свойства memory.

Свойство performance.memory предпочтительно для быстрой диагностики использования памяти в браузере Chrome, в то время как для Node.js применяется process.memoryUsage().

Аналоги в других языках программирования

Разные языки предоставляют свои инструменты для мониторинга памяти.

Python: Модуль resource или psutil для получения данных о памяти процесса.

import psutil
import os
process = psutil.Process(os.getpid())
print(process.memory_info().rss)
12345678

PHP: Функция memory_get_usage() и memory_get_peak_usage().

echo memory_get_usage();
1234567

C: Использование системных вызовов, таких как getrusage() или чтение виртуальных файлов в /proc/self/stat в Linux.

#include <sys/resource.h>
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
printf("Memory usage: %ld KB\n", usage.ru_maxrss);
Memory usage: 1234 KB

Основное отличие performance.memory от аналогов — его интеграция в браузерную среду и фокус на куче JavaScript.

Типичные ошибки

При работе с performance.memory могут возникать следующие проблемы:

  • Отсутствие поддержки: Свойство доступно не во всех браузерах. Попытка доступа в Firefox или Safari вызовет ошибку.
  • if (performance.memory) {
      console.log(performance.memory.totalJSHeapSize);
    } else {
      console.log('Свойство memory не поддерживается');
    }
    Свойство memory не поддерживается
  • Неточные данные: Значения могут не отражать мгновенное состояние из-за внутренней оптимизации сборщика мусора.
  • Зависимость от флагов: В некоторых версиях Chrome доступ к свойству требует включения флага --enable-memory-info.

Изменения в последних версиях

Свойство performance.memory не является частью стандарта W3C и его спецификация может меняться разработчиками браузеров. В последних версиях Chrome наблюдается тенденция к ограничению доступа к этой информации из соображений безопасности и приватности. Вместо этого рекомендуется использовать стандартизированные API, такие как PerformanceObserver, хотя на данный момент они не включают метрики памяти. Разработчикам следует проверять доступность свойства в целевых браузерах.

Расширенные примеры

Мониторинг утечек памяти с интервалами.

Пример javascript
let initialMemory = performance.memory.usedJSHeapSize;
let interval = setInterval(() => {
  let currentMemory = performance.memory.usedJSHeapSize;
  console.log(`Разница в памяти: ${currentMemory - initialMemory} байт`);
  initialMemory = currentMemory;
}, 5000);
// Остановка через 30 секунд
setTimeout(() => clearInterval(interval), 30000);
Разница в памяти: 1024 байт
Разница в памяти: -512 байт
Разница в памяти: 2048 байт

Сравнение состояния памяти до и после сборки мусора.

Пример javascript
// Принудительный вызов сборки мусора (только с включенным флагом --js-flags="--expose-gc")
if (typeof gc === 'function') {
  const beforeGC = performance.memory.usedJSHeapSize;
  gc();
  const afterGC = performance.memory.usedJSHeapSize;
  console.log(`Освобождено ${beforeGC - afterGC} байт`);
}
Освобождено 1048576 байт

Агрегация данных о памяти за период времени.

Пример javascript
let samples = [];
function collectMemorySample() {
  samples.push({
    used: performance.memory.usedJSHeapSize,
    total: performance.memory.totalJSHeapSize,
    timestamp: Date.now()
  });
  if (samples.length > 100) samples.shift();
}
// Вызов collectMemorySample при определенных событиях

JS performance.memory function comments

En
Performance.memory (Chrome) Returns an object containing memory usage information