web-dev-qa-db-fra.com

Comment demander l'exécution de Garbage Collector dans node.js?

Au démarrage, il semble que mon application node.js utilise environ 200 Mo de mémoire. Si je le laisse seul pendant un certain temps, il se réduit à environ 9 Mo.

Est-il possible depuis l'application de:

  1. Vérifiez la quantité de mémoire utilisée par l'application?
  2. Demander au garbage collector de s'exécuter?

La raison pour laquelle je demande est, je charge un certain nombre de fichiers à partir du disque, qui sont traités temporairement. Cela provoque probablement une augmentation de l'utilisation de la mémoire. Mais je ne veux pas charger plus de fichiers jusqu'à ce que le GC s'exécute, sinon il y a un risque de manquer de mémoire.

Aucune suggestion ?

52
Kaizer Sozay

Si vous lancez le processus de noeud avec l'indicateur --expose-gc, Vous pouvez alors appeler global.gc() pour forcer le noeud à exécuter le garbage collection. Gardez à l'esprit que toutes les autres exécutions au sein de votre application de nœud sont suspendues jusqu'à la fin du GC, alors ne l'utilisez pas trop souvent ou cela affectera les performances.

Vous voudrez peut-être inclure une vérification lors des appels GC depuis votre code afin que les choses ne se gâtent pas si le nœud a été exécuté sans l'indicateur:

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

Le nœud nous permet de déclencher manuellement le Garbage Collection. Cela peut être accompli en exécutant Node avec l'indicateur --expose-gc (C'est-à-dire node --expose-gc index.js).
Une fois que le nœud s'exécute dans ce mode, vous pouvez déclencher par programmation une récupération de place à tout moment en appelant global.gc() à partir de votre programme.

ex -

// 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
Piqué