La récupération de place et la gestion de la mémoire en JavaScript sont des sujets légèrement inconnus pour la plupart des développeurs, car nous n’effectuons généralement aucune opération de gestion de la mémoire explicitement dans la majorité des langages de programmation. Cependant, il est recommandé (et toujours bénéfique) de savoir comment fonctionne le cycle de gestion de la mémoire et comment les ressources occupées sont libérées lorsqu’elles ne sont plus utilisées.
Allocation de mémoire en JavaScript
Dans les langages de programmation de bas niveau comme C, les développeurs doivent prendre soin de la mémoire. Ils doivent localiser ou libérer manuellement la mémoire à l’aide de fonctions telles que calloc(), malloc(), réallouer()et libre(). Dans les langages de haut niveau comme JavaScript et Java, cependant, nous n’avons pas besoin d’allouer ou de désallouer manuellement de la mémoire ; Au lieu de cela, cela est fait par la langue elle-même.
En JavaScript, lorsque vous créez un nouvel objet, vous n’avez besoin d’aucune méthode spéciale pour allouer de la mémoire à cet objet. De même, lorsque vous souhaitez détruire cet objet, vous n’avez pas besoin d’appeler explicitement une méthode spéciale pour libérer de la mémoire. JavaScript est là pour vous permettre de gérer seul l’allocation et la désallocation de mémoire.
Le processus de gestion de la mémoire dans presque tous les langages de haut niveau est automatique, mais cela ne signifie pas que les développeurs sont exempts de soucis en ce qui concerne la gestion de la mémoire. La façon dont vous avez codé quelque chose a un impact significatif sur l’allocation de mémoire. Si le code que vous avez écrit est de mauvaise qualité, cela peut entraîner une fuite de mémoire et éventuellement les performances de l’application peuvent en souffrir. Il est donc très important de prendre conscience des techniques de gestion de la mémoire et du ramasse-miettes.
Avant de plonger dans le ramasse-miettes, il faut d’abord se pencher sur la gestion de la mémoire.
Lis: Outils et bibliothèques HTML, CSS et JavaScript
Quel est le cycle de vie de la mémoire JavaScript
Le cycle de vie de la mémoire décrit comment la mémoire est gérée. Le processus est divisé en trois étapes. Tout d’abord, vous avez besoin de mémoire pour localiser. Chaque fois que vous créez une nouvelle variable et lui attribuez une valeur, il allouera la mémoire pour cette variable.
La deuxième étape consiste à utiliser cette mémoire attribuée pour des tâches telles que des opérations de lecture ou d’écriture. Vous voudrez peut-être lire la propriété de certains objets ou les modifier d’une manière ou d’une autre.
La troisième étape consiste à libérer de la mémoire pour cet objet. Vous pouvez libérer de la mémoire lorsque cette variable ou cet objet n’est plus nécessaire. La troisième étape est critique car si vous ne libérez pas la mémoire occupée de votre programme, il consommera de plus en plus de mémoire de votre application et entraînera le plantage de votre application.
La désallocation de mémoire est parfois une tâche difficile dans le processus de cycle de mémoire, qu’elle soit effectuée manuellement ou qu’elle soit gérée par le langage de programmation lui-même.
Exemples de récupération de place JavaScript
Un langage de programmation moderne et de haut niveau tel que JavaScript prend en charge toutes les étapes de la gestion de la mémoire, de l’allocation des ressources à leur libération. Mais comment la mémoire est-elle libérée une fois qu’elle n’est plus nécessaire ? Notre section suivante décrit la diffusion des ressources écrites par le biais d’un processus appelé collecte des ordures.
Fonctionnement de la récupération de place en JavaScript
Comme nous l’avons déjà mentionné, la troisième étape de la gestion de la mémoire est un processus difficile. Comment JavaScript sait-il quelle mémoire doit être libérée ? Quels outils sont utilisés par le ramasse-miettes pour libérer ces ressources ?
Il existe quelques algorithmes et outils que le ramasse-miettes utilise pour comprendre cela. Jetons un coup d’œil à certaines de ces stratégies dans la section suivante.
Lis: Programmation asynchrone en JavaScript
Stratégie de collecte de déchets de comptage de référence
Cette stratégie de récupération de place est utilisée pour pointer les ressources qui n’ont plus de références. Considérez l’extrait de code suivant :
const obj = { name: ‘Bob’, country: 'United States', }; obj = 'You are reading the article on Garbage Collection';
Initialement, le obj l’objet contient certains attributs de propriété. Plus tard, le développeur a décidé de changer le obj objet pour contenir une valeur primitive. Alors maintenant, le premier obj L’objet ne contient aucune référence pointant vers lui, ce qui le rend prêt à être réclamé pour la récupération de place.
Mais ce n’est pas aussi simple que cela.
Il existe une stratégie moins connue que vous devriez connaître, appelée dépendance circulaire. Le développeur n’y a probablement jamais pensé auparavant, car JavaScript le gère pour vous sous le capot.
Pensez à une situation où deux objets se référencent. Dans ce cas, le ramasse-miettes ne serait pas en mesure de décider lequel supprimer de la mémoire car chacun a au moins une référence à un autre.
Pour mieux comprendre, considérez l’extrait de code JavaScript suivant :
var obj = { a: { b: ‘Hello’ } }; obj = 15.6; function callMe() { var obj = {}; var obj2 = {}; obj.a = obj2; obj2.a = obj; return obj; } callMe();
Le code ci-dessus montre que l’objet obj fait référence obj2 et obj2 fait référence obj. Cela crée un cycle.
Une fois la portée retirée de la fonction appelez-moi(), le garbage collector ne pourra pas libérer la mémoire occupée par ces deux objets car ils contiennent des références l’un à l’autre. Cela provoque une fuite de mémoire du programme.
Pour surmonter cette situation, JavaScript a une autre stratégie dont les développeurs peuvent tirer parti, comme détaillé dans la section suivante.
L’algorithme de marquage et de balayage JavaScript
La marquer et balayer algorithm est un célèbre algorithme utilisé pour le ramasse-miettes et il est bien meilleur que l’algorithme de la section précédente. Il fonctionne sur le principe de déterminer si l’objet peut être atteint depuis le racine. En JavaScript, vous pouvez penser à racine comme un la fenêtre objet dans un navigateur Chrome ; penser à un global objet si vous êtes sur un Node.js application.
Cette stratégie fonctionne comme suit :
D’abord, il marque tous les racine objets. Ensuite, il visitera toutes les références accessibles à partir de ces racine objets. Là encore, il revisite les objets marqués et marque leurs références. Ce processus de visite et de marquage se poursuit jusqu’à ce que toutes les références accessibles soient visitées.
Le ramasse-miettes peut maintenant identifier quels objets sont marqués et lesquels ne le sont pas. Ainsi, les objets qui ne sont pas marqués (on les appelle inaccessible objets) sont sélectionnés pour la récupération de place et sont finalement supprimés de la mémoire.
Lis: POO en JavaScript avec des classes
Réflexions finales sur la récupération de place en JavaScript
Ce didacticiel pour développeurs Web n’était qu’un aperçu des stratégies de récupération de place utilisées dans JavaScript. Le sujet est beaucoup plus complexe et ne peut être expliqué dans un seul article. Je recommande aux développeurs d’en savoir plus à ce sujet via la documentation MDN.
La manière dont un développeur code a également un impact sur la quantité de mémoire qui lui sera attribuée. C’est pourquoi il est important de se concentrer sur l’écriture de code avec les meilleures pratiques et de se familiariser avec les stratégies de récupération de place et comment elles libèrent les ressources en cas de besoin. Il existe plusieurs outils et méthodes sur le marché qui peuvent également vous aider à analyser les fuites de mémoire et d’autres problèmes de performances dans votre programme.