Як подати запит на запуск збирача сміття в node.js?


77

Здається, під час запуску моя програма node.js використовує близько 200 МБ пам’яті. Якщо я залишу його на деякий час, він зменшується приблизно до 9 Мб.

Чи можна з додатка:

  1. Перевірте, скільки пам'яті використовує програма?
  2. Попросити запуск збирача сміття?

Причиною того, що я запитую, є те, що я завантажую кілька файлів з диска, які тимчасово обробляються. Це, ймовірно, спричиняє швидке використання пам'яті. Але я не хочу завантажувати більше файлів, поки не запуститься GC, інакше є ризик, що у мене закінчиться пам’ять.

Будь-які пропозиції ?


Як ви завантажуєте ці файли? Якщо вам потрібно завантажити величезний файл, ви повинні скористатись підходом Stream, і ви можете обробити файл, продовжуючи читати. Ви розглядали це?
ну

@well Це було 3 роки тому. Зараз я працюю над іншим проектом і не можу багато про це пам’ятати.
Рахул Ієр

Відповіді:


120

Якщо ви запустите процес вузла з --expose-gcпрапором, ви можете зателефонувати, global.gc()щоб примусити вузол запустити збір сміття. Майте на увазі, що всі інші дії у вашій програмі вузла призупиняються до завершення GC, тому не використовуйте його занадто часто, інакше це вплине на продуктивність.

Можливо, ви захочете включити перевірку під час здійснення дзвінків GC з вашого коду, щоб справи не пішли погано, якщо вузол був запущений без прапора:

try {
  if (global.gc) {global.gc();}
} catch (e) {
  console.log("`node --expose-gc index.js`");
  process.exit();
}

1
Де документи для "--expose-gc"? Я не знаходжу жодних документів на nodejs.org.
pea3nut

2
@ pea3nut - це варіант виконання V8, який використовує вузол. Цей та інші варіанти можна перерахуватиnode --v8-options
janispritzkau

3
Вам потрібно передати функцію для повного GC, інакше він просто зробить незначний GC
Піюш Балапуре

@PiyushBalapure, у вас є посилання на аргументи gc ()?
Франк Фрайбургер,

Я ще не бачу документації для аргументів gc (). Навіть не знайшов у документах V8. Я читав про повний GC тут nodesource.com/blog/…
Піюш Балапуре,

8

Вузол дозволяє нам запускати збір сміття вручну. Цього можна досягти, запустивши Node з --expose-gcпрапором (тобто node --expose-gc index.js).
Після того, як вузол запущений у цьому режимі, ви можете в будь-який час програмно запустити збір сміття, зателефонувавши global.gc()зі своєї програми.

екс -

// Force garbage collection every time this function is called
try {
  if (global.gc) {global.gc();}
} catch (e) {
  console.log("`node --expose-gc index.js`");
  process.exit();
}

-6

Одне, що я б запропонував, це те, що, якщо вам не потрібні ці файли безпосередньо під час запуску, намагайтеся завантажувати лише тоді, коли вони вам потрібні.

EDIT: Зверніться до публікації вище.


Мені потрібні файли під час запуску. І насправді, після запуску GC, мій додаток використовує лише 9 Мб пам’яті за весь час свого існування. Все, що я роблю, - це вимагати об’єкта JSON (тобто словника). Оскільки цей код є внутрішнім для node.js, я не можу його оптимізувати. Але мені потрібен словник для пошуку пропозицій щодо пошуку.
Rahul Iyer

Я трохи розгублений. Як це almost no memoryзменшується до 9 МБ, якщо вам потрібен цей об’єкт для пошукових пропозицій? Я припускаю, що це повинно залишитися у вашому додатку протягом усього життя ..
lwang135

що ви маєте на увазі під майже відсутністю пам’яті? Так, я "вимагаю" файлу json робити щось на зразок var foo = require ('./ mydictionary'), і він існує протягом усього мого додатка. Під час запуску використання пам'яті мого додатка node.js сягає 200 Мб! (Я не розумію, чому ви майже не говорите про пам’ять), а потім через деякий час знижується до 9 МБ, хоча словник все ще знаходиться в пам'яті.
Rahul Iyer

Вибачте, я сказав "майже немає пам'яті", тому що ви сказали "Але я не хочу завантажувати більше файлів, поки не запуститься GC, інакше є ризик, що в мене закінчиться пам'ять". Можливо, правильно зробити, це шукати, що змушує ваш додаток перейти на 200 Мб. Якщо словник є в пам'яті, це не повинно бути причиною цього.
lwang135

Це просто оператор require ((./foo)). Об'єкт JSON зі списками рядків. Мій сервер має лише 1 Гб пам’яті, тому я просто граю в безпеці.
Rahul Iyer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.