Quando abbiamo iniziato a testare il nostro progetto NodeJS abbiamo notato un enorme consumo di memoria. È causato da perdite di memoria in tutto il nostro progetto. Quindi abbiamo iniziato a cercare tutte le cause che possono causare perdite di memoria. Ci sono alcune risposte a questa domanda su StackOverflow, ma non esiste alcun documento più preciso su cosa sia e cosa non sia una perdita di memoria.Perdite di memoria e problemi di chiusura in NodeJS
Le mie domande:
- Esiste un documento sul V8 GC e come funziona (in dettaglio)?
- Come rilasciare le richiamate in modo che GC possa raccoglierle?
Il V8 GC raccoglie le variabili che non vengono utilizzate ma c'è una chiusura di funzione sotto di esse? Esempio:
var serviceChannel = require('./channel'); var dataRegistration = require('../data/registration'); function registerOnChannel(userID, channelID, callsuccess, callerror) { serviceChannel.findChannel(channelID, function (channel) { if (!channel) { callerror("Channel doesn' exists"); return; } dataRegistration.registerOnChannel(userID, channelID, function (registration) { if (!registration) { callerror("Registration doesn' exists"); return; } callsuccess("Registration successful"); }, function (error) { callerror("Error on registration"); }) }, function (error) { callerror("Error on finding channel"); }) }
Così, serviceChannel e dataRegistration verrà mantenuto in memoria fino a quando registerOnChanel è dal vivo. Ma il canale variabile sarà cancellato dal GC (non è utilizzato da alcuna funzione)?
"Così, serviceChannel e dataRegistration verranno mantenuti in memoria finché registerOnChanel è attivo". Come vieni a questa conclusione? –
È una chiusura. –
Non ci sono prove di chiusura nel codice che hai postato, almeno non in modo tale da mantenere in vita ServiceChannel o DataRegistration. –