Performance.memory: примеры (JAVASCRIPT)
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 не поддерживается
--enable-memory-info.Изменения в последних версиях
Свойство performance.memory не является частью стандарта W3C и его спецификация может меняться разработчиками браузеров. В последних версиях Chrome наблюдается тенденция к ограничению доступа к этой информации из соображений безопасности и приватности. Вместо этого рекомендуется использовать стандартизированные API, такие как PerformanceObserver, хотя на данный момент они не включают метрики памяти. Разработчикам следует проверять доступность свойства в целевых браузерах.
Расширенные примеры
Мониторинг утечек памяти с интервалами.
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 байт
Сравнение состояния памяти до и после сборки мусора.
// Принудительный вызов сборки мусора (только с включенным флагом --js-flags="--expose-gc")
if (typeof gc === 'function') {
const beforeGC = performance.memory.usedJSHeapSize;
gc();
const afterGC = performance.memory.usedJSHeapSize;
console.log(`Освобождено ${beforeGC - afterGC} байт`);
}Освобождено 1048576 байт
Агрегация данных о памяти за период времени.
let samples = [];
function collectMemorySample() {
samples.push({
used: performance.memory.usedJSHeapSize,
total: performance.memory.totalJSHeapSize,
timestamp: Date.now()
});
if (samples.length > 100) samples.shift();
}
// Вызов collectMemorySample при определенных событиях