Maison > Article > interface Web > Une analyse approfondie du mécanisme de garbage collection dans JS
Les types de base sont stockés sur la pile et les types de référence sont stockés sur le tas. JavaScript alloue automatiquement de la mémoire lorsque des variables (objets, chaînes, etc.) sont créées et les libère « automatiquement » lorsqu'elles ne sont pas utilisées. Le processus de libération est appelé garbage collection.
Toutes les tâches que le ramasse-miettes doit effectuer
Marquer les objets actifs (vivants) et les objets inactifs (non vivants) dans l'espace
Recyclez ou réutilisez la mémoire occupée par les objets inactifs
Organisation de la mémoire pour éviter l'apparition d'une fragmentation de la mémoire
D'une manière générale, les objets non référencés sont des déchets et doivent être déblayés. Parcourez l'objet en partant de la racine.
Exceptions
Si plusieurs références d'objets forment un anneau et se réfèrent les unes aux autres, mais que la racine ne peut pas y accéder, ces objets sont également des déchets et doivent être effacés.
L'objet racine
possède un ensemble de base de valeurs intrinsèquement accessibles qui ne peuvent pas être supprimées pour des raisons évidentes
Objets vivants
Toute autre valeur est considérée comme accessible si la référence ou la chaîne de référence est accessible depuis la racine
Split the tas Pour la nouvelle génération et l'ancienne génération.
La nouvelle génération stocke les objets avec une durée de survie courte, et l'ancienne génération stocke les objets avec une durée de survie longue.
divise la heap memory en deux parties, l'une est la zone d'utilisation, qui est l'espace utilisé ; l'espace à l'état inactif.
Les objets nouvellement ajoutés seront stockés dans la zone d'utilisation Lorsque la zone d'utilisation est presque pleine, une opération de nettoyage des déchets est nécessaire.
Le garbage collector nouvelle génération marquera les objets actifsobjets dans la zone d'utilisation. Résolution du problème des blocs de mémoire dispersés.
Objets déplacés vers l'ancienne génération
Problème de pause complète JavaScript est un langage monothread qui s'exécute sur le thread principal. Lorsque le garbage collection est effectué, il bloquera l'exécution du script JavaScript et. vous devez attendre la fin du garbage collection. Reprendre l'exécution du script.
Mécanisme de recyclage parallèle Lors de l'exécution du garbage collector sur le thread principal, plusieurs threads auxiliaires sont démarrés pour effectuer le même travail de recyclage en même temps.
1. Il existe de nombreux objets survivants et la copie fréquente des objets survivants réduira l'efficacité
2. Gaspiller la moitié de l'espace
mark-clear , lorsque l'allocation de mémoire est insuffisante, utilisez la méthode mark-organize
Algorithme utilisé dans la période de collecte des ordures de l'ancienne génération
1. Utilisez d'abord mark-clear pour terminer le recyclage de l'espace poubelle ; Utilisez mark-organize pour récupérer de l'espace Optimisation ; 3. Utilisez le marquage incrémentiel et le nettoyage paresseux pour optimiser l'efficacité
Les objets vivants ne représentent qu'une petite partie de la nouvelle génération, et les objets morts ne représentent qu'une petite partie de l'ancienne génération. C'est pourquoi les deux méthodes de recyclage peuvent être traitées efficacement
.
Trop de fragmentation de la mémoire. Si une grande mémoire doit être allouée, le garbage collection sera déclenché à l'avance car l'espace fragmenté restant n'est pas suffisant pour terminer l'allocation et cette collecte est inutile.
-> Algorithme d'organisation du marquage Après avoir marqué les objets survivants, déplacez les objets survivants vers une extrémité de l'espace mémoire. Une fois le mouvement terminé, effacez toute la mémoire en dehors des limites
Marquage incrémental
S'il y a de nombreux objets et que nous essayons de parcourir et de marquer l'ensemble des objets en même temps, cela peut prendre un certain temps et avoir un certain retard dans l'exécution. Par conséquent, le moteur tente de diviser le garbage collection en plusieurs parties. Ensuite, chaque partie est exécutée séparément.
V8 a optimisé le garbage collector d'ancienne génération, passant du marquage de pause complète au marquage incrémentiel.
Transformez un garbage collection en une courte période de garbage collection GC
Si une stratégie de marquage en noir et blanc (survie et mort) est adoptée, après que le garbage collector ait effectué une période de collecte incrémentielle, le thread principal est activé après une pause Pour exécuter un morceau de code JavaScript dans l'application, puis lorsque le garbage collector est redémarré, la mémoire est en noir et blanc, et on ne sait pas où aller ensuite
Nettoyage paresseux
Marque d'incrément Une fois terminé , le nettoyage paresseux commence. Lorsque le marquage incrémentiel est terminé, si la mémoire actuellement disponible est suffisante pour exécuter le code rapidement, nous n'avons en fait pas besoin de nettoyer la mémoire immédiatement. Nous pouvons retarder légèrement le processus de nettoyage et laisser le code du script JavaScript s'exécuter en premier. Il n'est pas nécessaire de tout nettoyer en même temps. Une fois que toute la mémoire des objets inactifs est effacée, vous pouvez la nettoyer un par un selon vos besoins jusqu'à ce que toute la mémoire des objets inactifs soit effacée, puis effectuer un marquage incrémentiel
marquage tricolore L'opération de marquage de la méthode peut être exécutée progressivement sans analyser tout l'espace mémoire à chaque fois. Elle peut être bien coordonnée avec un recyclage incrémentiel pour effectuer certaines opérations de pause et de récupération, ainsi. réduisant le temps de pause complet. Blanc : Objet non marqué
Gris : lui-même est marqué, l'objet de référence de l'objet n'est pas marqué
Cela continue ainsi jusqu'à ce qu'il n'y ait plus d'objets pouvant être marqués en gris, c'est-à-dire qu'il n'y ait plus d'objets pouvant être atteints. Ensuite, tous les objets blancs restants. sont inaccessibles et attendent d'être recyclés.
Write Barrier
Le nouvel objet D est initialement blanc, mais il n'y a aucun objet gris pour le moment, ce qui signifie que tous les marquages sont terminés et que le nettoyage doit commencer. D sera recyclé pendant la phase de nettoyage. Ce n'est pas correct.
V8 introduit un mécanisme de barrière d'écriture. Une fois qu'un objet noir fait référence à un objet blanc, ce mécanisme transformera l'objet blanc référencé en gris
[Apprentissage recommandé :
Tutoriel avancé javascript]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!