« Lâapplication fonctionne, mais pourquoi devient-elle de plus en plus lente ? »
« Il nây a pas dâerreur dans le code, mais les performances sont au ralenti⊠»
« Lâonglet Chrome est littĂ©ralement Ă bout de souffle » đ„”FĂ©licitations.
Vous venez peut-ĂȘtre de rencontrer une fuite de mĂ©moire.Aujourdâhui, nous allons :
- Comprendre vraiment ce quâest une fuite de mĂ©moire
- Examiner exactement dâoĂč elle vient
- Et surtout : apprendre comment la prévenir
đ§ Quâest-ce quâune fuite de mĂ©moire ? (Explication trĂšs claire)
Une fuite de mĂ©moire se produit lorsque JavaScript garde des donnĂ©es dans la RAM alors quâelles ne sont plus nĂ©cessaires.
Flux normal :
- Les données sont créées
- Les données sont utilisées
- Une fois terminĂ©es â supprimĂ©es đ§č
Avec une fuite de mémoire :
« Peut-ĂȘtre que ça servira plus tard⊠»
JavaScript refuse de les supprimer đŹRĂ©sultat :
- RAM saturée
- Lâapplication ralentit
- Le navigateur commence Ă se plaindre
đ§č Garbage Collector (Le concierge prudent)
JavaScript a un Garbage Collector.
Son rĂŽle :
Supprimer les données qui ne sont plus accessibles
Exemple simple :
let user = { name: "Ali" }; user = null;
{ name: "Ali" }nâest plus accessible- Le Garbage Collector arrive et dit :
« OK, on peut le supprimer » â
đĄ Le problĂšme survient lorsque vous gardez accidentellement des donnĂ©es accessibles.
Le Garbage Collector dira alors :
« Ceci est encore vivant⊠» đ
đš Signes dâune fuite de mĂ©moire (Votre app appelle Ă lâaide)
Faites attention si vous remarquez :
- đ Lâapplication devient de plus en plus lente
- đ La RAM augmente constamment
- đ Actualiser la page la rĂ©tablit temporairement
- đ» Le ventilateur de lâordinateur tourne Ă fond âïž
đ Causes les plus courantes des fuites de mĂ©moire en JavaScript
Plongeons maintenant dans les piĂšges classiques que tout le monde rencontre đ
1ïžâŁ Variables globales â « Je suis lĂ et je ne pars pas »
â Code dangereux
leakedValue = "Oops";Que sâest-il passĂ© ?
- Pas de
let,constouvar- Devient automatiquement global
- Reste dans la RAM jusquâĂ la fermeture de la page đŻ
Exemple sournois :
function createData() { data = new Array(1000000); } createData();
datareste en mĂ©moire mĂȘme aprĂšs la fin de la fonctionâ Utilisation correcte
function createData() { const data = new Array(1000000); }đ§ RĂšgle :
Les variables globales = fuites de mémoire potentielles
2ïžâŁ Event listeners â « Vous lâavez ajoutĂ©, mais oubliĂ© »
Erreur classique :
button.addEventListener("click", () => { console.log("Clicked"); });ProblĂšme ?
- Le bouton peut ĂȘtre supprimĂ© du DOM
- Le listener reste en mémoire
- JS pense « un jour quelquâun cliquera dessus » đ
â DĂ©sastre dans les SPA
- La page change, le composant disparaĂźt, mais le listener persiste
â Utilisation correcte :
function handleClick() { console.log("Clicked"); } button.addEventListener("click", handleClick); // Nettoyage button.removeEventListener("click", handleClick);đ RĂšgle dâor :
Si vous ajoutez un événement, prévoyez de le retirer
3ïžâŁ setInterval & setTimeout â Bombe Ă retardement â°
â Dangereux
setInterval(() => { console.log("Running..."); }, 1000);Que se passe-t-il ?
- La page change ou le composant se démonte
- Lâintervalle continue Ă tourner indĂ©finiment đ
â Utilisation correcte
const id = setInterval(() => { console.log("Running..."); }, 1000); // Stoppez-le lorsque terminĂ© clearInterval(id);âïž En React :
useEffect(() => { const id = setInterval(() => { console.log("tick"); }, 1000); return () => clearInterval(id); }, []);đĄ Astuce :
Si vous avez un intervalle mais que vous ne le nettoyez pas â fuite probable
4ïžâŁ Closures â Superpuissance avec effets secondaires đ§
Quâest-ce quâune closure ?
Une fonction qui se souvient des variables de son scope externe
function counter() { let count = 0; return function () { count++; console.log(count); }; }Ici :
countnâest jamais supprimĂ©- Parce que la fonction interne lâutilise toujours
â Gros dataset + closure = fuite de mĂ©moire
function leakyClosure() { const bigArray = new Array(1000000); return () => { console.log(bigArray.length); }; }
- Tant que cette fonction existe â
bigArrayreste en RAM đ§â Solution
- Garder les grosses donnĂ©es Ă lâextĂ©rieur
- Nullifier les références lorsque terminé
5ïžâŁ RĂ©fĂ©rences DOM â ChaĂźnes invisibles
â Fuite classique
let box = document.getElementById("box"); document.body.removeChild(box); // box garde encore la rĂ©fĂ©renceQue sâest-il passĂ© ?
- Le DOM a disparu
- La référence JS reste
- Le Garbage Collector ne peut pas la supprimer
â Nettoyage
box = null;đ§č Maintenant, elle peut ĂȘtre collectĂ©e
đ”ïž Comment dĂ©tecter les fuites de mĂ©moire ?
đ Chrome DevTools
- Onglet Memory
- Heap Snapshot
- Allocation Timeline
Test logique :
« Ai-je vraiment encore besoin de ces données ? »
Si la rĂ©ponse est non â probablement une fuite đ
đĄïž Guide de prĂ©vention des fuites de mĂ©moire (Mur de sagesse)
âïž Ăvitez les variables globales
âïž Nettoyez les event listeners
âïž Stoppez les intervalles/timeouts
âïž Faites attention aux grosses closures
âïž Nullifiez les rĂ©fĂ©rences DOM
âïž Respectez le cycle de vie des composants
đŻ Pourquoi est-ce critique ?
Parce que les fuites de mémoire :
- Ne gĂ©nĂšrent pas dâerreurs
- Ne crient pas dans la console
- Tuent silencieusement les performances â ïž
Et en production :
« Pourquoi notre app est-elle si lente ? » đŹ
â RĂ©sumĂ© Ă©pique
- Fuite de mémoire = mémoire inutilisée reste allouée
- JavaScript ne vous avertira pas
- Lâun des bugs les plus dangereux
- Mais si vous savez comment les gĂ©rer â prĂ©venable â
Posted inLe Guide JavaScript
đŁ Quâest-ce quâune fuite de mĂ©moire et comment peut-elle vous hanter en JavaScript ?

