2014-12-05 12 views
29

All'avvio, sembra che la mia app node.js utilizzi circa 200 MB di memoria. Se lo lascio da solo per un po ', si riduce a circa 9 MB.Come richiedere il Garbage Collector in node.js per l'esecuzione?

E 'possibile all'interno della app per:

  1. controllare la quantità di memoria l'applicazione sta usando?
  2. Richiesta di Garbage Collector da eseguire?

La ragione per cui lo chiedo è che carico un numero di file dal disco, che vengono elaborati temporaneamente. Ciò probabilmente causa un picco nell'utilizzo della memoria. Ma non voglio caricare più file finché non viene eseguito il GC, altrimenti c'è il rischio che esaurisca la memoria.

Qualche suggerimento?

+0

Come stai caricando questi file? Se è necessario caricare un file enorme, è necessario utilizzare l'approccio Stream ed è possibile elaborare il file mentre sta ancora leggendo. Lo hai preso in considerazione? – well

+0

@well Questo è stato 3 anni fa. Sto lavorando ad un altro progetto ora e non ricordo molto a riguardo. –

risposta

56

Se si avvia la procedura del nodo con il flag --expose-gc, è possibile chiamare global.gc() per forzare il nodo a eseguire la garbage collection. Tieni presente che tutte le altre esecuzioni all'interno dell'app del tuo nodo sono in pausa fino al completamento del GC, quindi non utilizzarlo troppo spesso o influirà sulle prestazioni.

Si potrebbe voler includere un controllo quando si effettuano chiamate GC dall'interno del codice in modo le cose non vanno male se il nodo è stato eseguito senza il flag:

if (global.gc) { 
    global.gc(); 
} else { 
    console.log('Garbage collection unavailable. Pass --expose-gc ' 
     + 'when launching node to enable forced garbage collection.'); 
} 
-2

Una cosa che suggerirei è che, se non hai bisogno di quei file all'avvio, prova a caricare solo quando ne hai bisogno.

MODIFICA: fare riferimento al post in alto.

+0

Ho bisogno dei file all'avvio. In realtà, una volta eseguito il GC, la mia app utilizza solo 9 MB di memoria per tutta la vita della sua esistenza. Tutto ciò che faccio è richiedere un oggetto JSON (che è un dizionario). Poiché questo codice è interno a node.js, non posso ottimizzarlo. Ma ho bisogno che il dizionario sia disponibile per i suggerimenti di ricerca. –

+0

Sono un po 'confuso. Come va da 'quasi nessuna memoria' fino a 9 MB se hai bisogno di questo oggetto per i suggerimenti di ricerca? Presumo che quelli dovrebbero rimanere per tutta la vita per la tua app .. – lwang135

+0

cosa intendi per quasi nessuna memoria? Sì, "Richiedo" che il file json esegua qualcosa come var foo = require ('./ mydictionary'), ed esiste per tutta la vita della mia app. All'avvio l'utilizzo della memoria della mia app node.js arriva fino a 200 MB! (Non capisco perché dici quasi nessuna memoria), e dopo un po 'di tempo scende a 9 MB, anche se il dizionario è ancora in memoria. –

0

Nodo ci permette di attivare manualmente Garbage Collection. Questo può essere ottenuto eseguendo il nodo con l'indicatore --expose-gc (cioè il nodo --expose-gc index.js).
Una volta che il nodo è in esecuzione in tale modalità, è possibile attivare in modo programmatico una Garbage Collection in qualsiasi momento chiamando global.gc() dal programma.

ex - // Forza garbage collection ogni volta che questa funzione viene chiamata

try { 
    global.gc(); 
} catch (e) { 
    console.log("You must run program with 'node --expose-gc index.js' or 'npm start'"); 
    process.exit(); 
}