Qu'est-ce qu'une fuite de mémoire en programmation ?
La mémoire d'un logiciel qui fuite, mais d'où part la fuite et vers où ? Où vont les données et quelles sont les conséquences ?
Article publié le 28/08/2023, dernière mise à jour le 19/09/2023
En informatique, une fuite de mémoire est un problème qui survient lorsqu'un logiciel stocke des données dans la mémoire vive de la machine, sans jamais supprimer ces données.
Au fur et à mesure de l'exécution du programme, ces données vont grossir, plus ou moins vite, jusqu'à saturer la mémoire vive et forcer le programme à s'arrêter.
Ou pire, forcer la machine entière à redémarrer.
Comment ça fonctionne ?
Imaginez un programme, dont le seul but est de redimensionner des images, et qui fonctionne comme ceci :
- On lui donne un chemin vers une image
- Il ouvre les données de l'image (les stockent dans la RAM)
- Il crée une copie de l'image d'origine, en modifiant les données pour réduire l'image de 50%
- Il enregistre l'image dans un dossier spécifique
Admettons que l'on donne une image de 2Mo à notre programme, il va devoir stocker en RAM :
2Mo lors de l'ouverture de l'image d'origine + 1Mo pour l'image redimensionnée (50%)
Et comme nous n'avons jamais spécifié à notre programme que les données de la RAM devaient être nettoyées après que l'image finale a été sauvegardée, notre logiciel va continuer à remplir notre mémoire vive.
Jusqu'au crash.
Comment détecter une fuite de mémoire ?
En général, une fuite de mémoire est "facile" à détecter, mais pas forcément à corriger. Le signe qui ne trompe pas, c'est la courbe de l'évolution d'utilisation de la RAM au fur et à mesure de l'utilisation du logiciel.
Voilà par exemple une fuite de mémoire arrivée il y a quelques mois, puis corrigée, sur le site de Code-Garage :
On y voit bien la consommation de la RAM monter indéfiniment, alors que la charge utilisateur était la même.
Après la correction, on peut voir que la consommation de mémoire vive reste quasiment au même niveau, tout au long de la journée !
Comment s'en prémunir ?
Il n’y a malheureusement pas de solution miracle pour corriger, ou empêcher une fuite mémoire.
Si l’on n'a réellement aucune piste, il faudra examiner minutieusement l’exécution de notre programme pour détecter la moindre variable qui pourrait poser problème…
Mais voyons quand même quelques conseils pour minimiser les chances créer une fuite mémoire :
Comprendre la gestion de la mémoire du langage
Certains langages de programmation possèdent un garbage collector, un système qui va traquer la mémoire vive utilisée par un programme, et libérer de l’espace automatiquement.
C’est le cas du JavaScript, du C#, du Java, etc…
Et d’autres langages ou la gestion mémoire (allocation/désallocation) doit être gérée manuellement.
C, C++ et Rust entre autres.
On ne code donc pas de la même manière avec ou sans un garbage collector, et il faut donc connaître les bases de la gestion de la mémoire des différents types de langages pour éviter les erreurs !
Se méfier des variables globales
Par définition, une variable globale restera en mémoire tant que le programme n'est pas terminé.
Donc si vous stockez des données dans une variable globale, comme un tableau par exemple, cette donnée va continuer de grossir, et ne sera jamais libérée !
Dans certains langages comme JavaScript, il est même possible de créer des variables globales par erreur, ce qui peut facilement créer une fuite de mémoire :
function example(){
text = "Hello";
}
example();
console.log(text); // > Hello
Normalement, une variable déclarée dans une fonction sera libérée dès que la fonction est terminée. Mais en JavaScript, si vous oubliez de déclarer votre variable avec var, let ou const, cette variable devient automatiquement une variable globale.
Et ce, sans que vous ne vous en rendiez compte !
Faire attention aux écouteurs d'évènements
Lorsque vous écoutez un évènement, comme ceci :
var element = document.getElementById('my-button');
element.addEventListener('click', handleClick);
Si jamais vous supprimez votre bouton de votre application, l'écouteur sera toujours là et sera lié à un objet fantôme.
Par conséquent, il ne pourra ni être supprimé manuellement, ni par le garbage collector, et provoquera donc une fuite de mémoire !
Aucun commentaire pour l'instant