Un memory leak (perdita di memoria) accade quando una parte della nostra applicazione continua a occupare memoria anche se non serve più, il che può portare a prestazioni peggiori nel tempo, browser che consumano più RAM e comportamenti strani o rallentamenti.
In JavaScript, questo capita spesso per via di closure, event listener e variabili che restano raggiungibili, anche se non più utili.
function outer() {
let secret = "mio segreto";
return function inner() {
console.log(secret);
};
}Una closure avviene quando una funzione interna può accedere a variabili definite in una funzione esterna, anche dopo che quest?ultima ha terminato la sua esecuzione. Facciamo un esempio più concreto:
function setupProfile(user) {
const bigData = new Array(1000000).fill(`Dati di ${user.name}`);
function onClick() {
console.log(`Aggiorno profilo di ${user.name}`);
}
document.getElementById('updateBtn').addEventListener('click', onClick);
}
setupProfile(myUser);In questo caso, la funzione setupProfile viene eseguita e associa un evento al click su un bottone. Ma dato che l'evento è definito all'interno della funzione, la variabile bigData e l'oggetto user restano in memoria anche dopo che la funzione ha finito l'esecuzione.
Un modo per evitare questo problema è rimuovere l'event listener quando non serve più. Possiamo farlo in vari modi, uno dei più semplici è impostare un timer e rimuoverlo dopo un certo periodo di tempo.
function setupProfile(user) {
// [...]
//Cleanup automatico dopo 30 secondi (esempio)
setTimeout(() => {
btn.removeEventListener('click', onClick);
}, 30000);
}In questo modo, non essendo più raggiungibile la funzione onClick, le variabili bigData e user non saranno più in memoria, evitando il memory leak.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Importare repository da Bitbucket a GitHub Enterprise Cloud
Loggare le query più lente con Entity Framework
Ricevere notifiche sui test con Azure Load Testing
Gestire codice JavaScript con code splitting e lazy loading
Integrare LLM alle nostre applicazioni in .NET con MCP
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Gestire progetti NPM in .NET Aspire
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Testare il failover sulle region in Azure Storage
Ciclo di vita risorse con .NET Aspire
Configurare automaticamente un webhook in Azure DevOps
Usare la libreria PredicateBuilder per eseguire query tramite Entity Framework che usano or su più campi


