Я случайно обнаружил, что когда React рендерирован на сервере, когда node_env! = Производство, это вызовет утечки памяти. Конкретные проблемы: https://github.com/facebook/react/issues/7406. Благодаря широкому использованию узлов и реагирования изоморфизма и других технологий, такие проблемы, как утечка памяти на стороне узла, должны привлечь наше внимание. Почему узел склонен к утечкам памяти и как устранение неполадок после его возникновения? Ниже приведено краткое введение и пример.
Прежде всего, Node основан на двигателе V8, а его метод управления памятью согласуется с V8. Ниже приведено краткое введение в соответствующие эффекты памяти V8.
V8 Предел памяти
Узел построен на V8 и может выделять и управлять объектами JS через V8. V8 имеет ограничения на использование памяти (около 1,4 г для 64-битной системы старого поколения, около 0,7 г для 32-разрядной системы, около 32 МБ для 64-битной системы нового поколения и около 16 МБ для 32-разрядной системы). При таких ограничениях крупные объекты памяти не смогут работать. Если эта граница случайно затронута, процесс выйдет.
Причина: V8 блокирует логику приложения JavaScript при выполнении сбора мусора, а затем пересматривает логику приложения JavaScript, пока сборник мусора не закончится. Такое поведение называется «остановленным миром». Если память о V8 составляет 1,5 ГБ, для V8 требуется более 50 мс, чтобы сделать небольшую сбору мусора, и для неинкрементной коллекции мусора требуется более 1 секунды.
Установите память нового поколения и память старого поколения, чтобы взломать предел памяти по умолчанию, установив узлы-Max Old-Size = xxx (единица MB) и узел-max-new-space-size = xxx (блок KB).
V8 состав кучи
Куча V8 на самом деле не состоит из двух частей: старого поколения и нового поколения. Куча можно разделить на несколько разных регионов:
GC -переработка типа
Впрыскивание GC
Указывает, собирает ли коллектор мусора (добавляет) мусор при сканировании пространства памяти и очищает мусор в конце цикла сканирования.
Неинкрементный GC
При использовании неинкрементного коллекционера мусора мусор пуст, как только он собирается.
Коллекционер мусора проведет только сборку мусора только для области памяти нового поколения, области указателя старого поколения и области данных старого поколения. Сначала объект входит в память нового поколения, которая занимает меньше места. Большинство объектов потерпят неудачу быстро, а неинкрементный GC непосредственно перерабатывает эти небольшие количества памяти. Если некоторые объекты не могут быть переработаны в течение определенного периода времени, они будут введены в область памяти старого поколения. Эта область выполняет нечастую инкрементную GC и занимает много времени.
Тогда когда произойдет утечка памяти?
Пути утечки памяти
Состав памяти узла в основном представляет собой часть, выделенную через V8, и часть, выделенная самим узлом. Основным ограничением коллекции мусора V8 является память V8. Основные причины утечек памяти: 1. Кэш; 2. Потребление очереди не является своевременным; 3. Область не выпущена
Анализ утечки памяти
Проверьте использование памяти v8 (байт блока)
process.memoryusage (); {ress: 47038464, heaptotal: 34264656, куча: 2052866}Ресс: Память резидента, часть процесса
Heaptotal, HepUpend: V8 Информация о памяти кучи
Проверьте использование памяти системы (байт единицы)
os.totalmem()
os.freemem ()
Возвращает общую системную память и простоя памяти
Просмотреть журнал сбора мусора
Узел -trace_gc -e "var a = []; for (var i = 0; i <1000000; i ++) {a.push (новый массив (100));}" >> gc.log //
Узел -prof // Используйте Windows-tick.processor для просмотра.
Инструменты аналитического мониторинга
V8-профильер захватывает снимки памяти V8 и анализ ЦП
Узел-Heapdump захватывает снимки памяти кучи V8
Использование стекла Node-Mtrace
Узел-мемблэтч слушает ситуацию с сбором мусора
Узел-Мемемский наблюдение
memwatch.on ('stats', function (info) {console.log (info)}) memwatch.on ('утечка', function (info) {console.log (info)})Событие статистики: каждый раз, когда выполняется полная куча мусора, будет запускается событие статистики. Это событие пройдет статистику памяти.
{"num_full_gc": 17, // Сколько сборов мусора с полным стеком "num_inc_gc": 8, // Сколько инкрементной коллекции мусора "heap_compactions": 8, // Сколько раз старое поколение разбирается "Оценка 2499912, // Минимум "Макс": 2592568, // максимальный "usage_trend": 0 // пользовательский тренд}Наблюдайте за NUM_FULL_GC и NUM_INC_GC Отражайте сбор мусора.
Событие утечки: если память до сих пор не выпущена после 5 последовательных коллекций мусора, это означает, что возникают утечки памяти. На этот раз будет вызвано событие утечки.
{Start: пт, 29 июня 2012 г. 14:12:13 GMT, конец: пт, 29 июня 2012 г. 14:12:33 GMT, рост: 67984, причина: «рост кучи более 5 последовательных GCS (20S) - 11,67 МБ/HR '}Куча разнообразная память Сравнение памяти Устранение Устранения Устранения Устранения Устранения кода памяти.
Ниже мы используем пример, чтобы продемонстрировать, как устранение утечек памяти:
Сначала мы создаем пример, который вызывает утечки памяти:
//App.jsvar app = require ('express') (); var http = require ('http'). server (app); var heapdump = require ('heapdump'); var leakobjs = []; function reakclass () {this.x = 1;} app.get ('/', funct 0; 3000); http.listen (3000, function () {console.log ('прослушивание на порту 3000');});Здесь мы имитируем утечки памяти, настраивая массив, который постоянно увеличивается и не получает.
Используйте модуль Heap-Dump, чтобы регулярно записывать снимки памяти, и импортируйте снимки через профили инструментов Chrome Developer для сравнения и анализа.
Мы видим, что после того, как браузер обращается к Localhost: 3000 и обновляется его много раз, размер снимка растет, и даже если его не запрашивают, это не уменьшается, что указывает на то, что утечка произошла.
Затем мы импортируем снимки через профили инструментов разработчика Chrome. Установив сравнение, сравните начальный снимок, отправьте запросы, а затем отправьте запросы для отправки снимков памяти на этих трех этапах. Вы можете обнаружить, что утечка увеличивается в новом. Всегда положительный в Delta, это означает, что он не был переработан.
краткое содержание
Для утечек памяти вы можете использовать Memwatch для имплантата или сообщить о процессе. Использование памяти MemoryUsage для регулярного мониторинга и установить порог тревоги для мониторинга.
Когда утечки памяти обнаруживаются, если разрешено, вы можете запустить узловой шарнир локально и использовать снимки памяти времена, которые будут сгенерированы. И использовать снимок, чтобы проанализировать причину утечки с помощью хромированных профилей. Если локальная отладка невозможна, используйте V8-профильс для вывода снимков памяти на тестовом сервере для сравнения и анализа JSON (требуется проникновение кода).
При каких обстоятельствах следует учитывать, Memwatch/Heapdump включен. Рассмотрим частоту Heapdump, чтобы избежать выпуска процессора. Другие способы обнаружения роста памяти также могут быть рассмотрены, например, процесс непосредственного мониторинга. Memoryusage ().
Остерегайтесь неправильного суждения, кратковременные пики использования памяти ведут себя как утечки памяти. Если ваше приложение внезапно потребляет много процессора и памяти, время обработки может охватывать несколько циклов сбора мусора, а затем Memwatch может неправильно оценить его как утечку памяти. Однако в этом случае, как только ваше приложение использует эти ресурсы, потребление памяти упадет до нормальных уровней. Поэтому важно отметить, что утечки памяти непрерывно сообщаются, а один или два внезапных тревоги могут быть проигнорированы.