Introduction
Les langues de bas niveau, telles que C, ont des primitives de gestion de la mémoire de bas niveau, telles que Malloc () et Free (). Les primitives de mémoire de JavaScript, en revanche, sont allouées lorsque des variables (objets, chaînes, etc.) sont créées, puis libérées "automatiquement" lorsqu'elles ne sont plus utilisées. Ce dernier s'appelle Garbage Collection. Cet "automatique" obscurcit et donne aux développeurs des développeurs JavaScript (et d'autres langues de haut niveau): ils peuvent ignorer la gestion de la mémoire.
Cycle de vie de la mémoire
Peu importe le langage de programmation, le cycle de vie de la mémoire est fondamentalement le même:
1. Allouer la mémoire dont vous avez besoin
2. Utilisez-le (lire, écrire)
3. Libérer PS: et "Mettez l'éléphant dans le réfrigérateur" signifie la même chose
Les première et deuxième parties du processus sont claires dans toutes les langues. La dernière étape est claire dans les langues de bas niveau, mais dans les langages de haut niveau comme JavaScript, la dernière étape n'est pas claire.
Allocation de mémoire pour JavaScript
Initialisation variable
Afin de ne pas déranger les programmeurs avec le problème de l'allocation, JavaScript termine l'allocation de mémoire lors de la définition des variables.
La copie de code est la suivante:
var n = 123; // allocation de la mémoire aux variables numériques
var s = "azerty"; // donne le type de caractère
var o = {
A: 1,
B: NULL
}; // allocation de la mémoire aux objets et à leurs variables contenues
var a = [1, null, "soutien-gorge"]; // allocation de la mémoire pour les tableaux et leurs variables contiennent (comme des objets)
fonction f (a) {
retourner un + 2;
} // allocation de la mémoire aux fonctions (objets appelés)
// Les expressions de fonction peuvent également attribuer un objet
someElement.addeventListener ('click', function () {
someElement.style.backgroundColor = 'Blue';
}, FAUX);
Allocation de mémoire via les appels de fonction
Certains appels de fonction entraînent l'allocation de la mémoire d'objet:
La copie de code est la suivante:
var d = new Date ();
var e = document.CreateElement ('div'); // Attribuez un élément DOM
Certaines méthodes attribuent de nouvelles variables ou de nouveaux objets:
La copie de code est la suivante:
var s = "azerty";
var s2 = s.substr (0, 3); // S2 est une nouvelle chaîne
// Parce que String est un invariant, JavaScript peut ne pas allouer la mémoire, mais il stocke uniquement la plage 0-3.
var a = ["Ouais ouais", "nan nan"];
var a2 = ["génération", "nan nan"];
var a3 = a.concat (a2); // Il y a quatre éléments dans le nouveau tableau qui rejoignent le tableau A et le tableau A2.
Utilisation des valeurs
Le processus d'utilisation des valeurs est en fait une opération de lecture et d'écriture de l'allocation de la mémoire, ce qui signifie qu'une variable ou une valeur de propriété d'un objet peut être écrite, ou même les paramètres d'une fonction peuvent être transmis.
Libéré lorsque la mémoire n'est plus nécessaire
La plupart des problèmes de gestion de la mémoire sont à ce stade. La tâche la plus difficile ici est de trouver "la mémoire allouée n'est en effet plus nécessaire". Il oblige souvent les développeurs à déterminer quel morceau de mémoire du programme n'est plus nécessaire et le libérer.
L'interprète linguistique de haut niveau est intégré à un "collecteur de déchets" et son travail principal est de suivre l'allocation et l'utilisation de la mémoire afin qu'elle soit automatiquement publiée lorsque la mémoire allouée n'est plus utilisée. Ce processus est une approximation car il est impossible de déterminer si un certain morceau de mémoire doit être déterminé (il ne peut pas être résolu par un algorithme).
Recyclage des ordures
Comme mentionné ci-dessus, la question de rechercher automatiquement si une certaine mémoire est "n'est plus nécessaire" est impossible à déterminer. Par conséquent, la mise en œuvre de la collecte des ordures ne peut résoudre que des problèmes généraux avec les limitations. Cette section expliquera les concepts nécessaires pour comprendre les principaux algorithmes de collecte des ordures et leurs limites.
Citation
Les algorithmes de collecte des ordures reposent principalement sur le concept de référence. Dans un environnement géré par la mémoire, si un objet a la permission d'accéder à un autre objet (implicitement ou explicitement), il est appelé un objet faisant référence à un autre objet. Par exemple, un objet JavaScript a une référence à son prototype (référence implicite) et une référence à ses propriétés (référence explicite).
Ici, le concept d'objet "objet" non seulement des objets JavaScript spéciaux, mais aussi de la portée de la fonction (ou de la portée lexicale globale).
Collection de références de décomptes
Il s'agit de l'algorithme de collecte des ordures le plus facile. Cet algorithme simplifie "si l'objet n'est plus nécessaire" comme "si l'objet a d'autres objets qui y sont référencés". Si aucune référence ne pointe vers l'objet (référence zéro), l'objet sera recyclé par le mécanisme de collecte des ordures.
Par exemple
La copie de code est la suivante:
var o = {
un: {
B: 2
}
};
// Deux objets sont créés, l'un est référencé comme l'attribut de l'autre, et l'autre est affecté à la variable O
// De toute évidence, aucun d'eux ne peut être collecté par ordures
var o2 = o; // La variable O2 est la deuxième référence à "cet objet"
O = 1; // Maintenant, la référence originale de "cet objet" est remplacée par O2
var oa = o2.a; // fait référence à la propriété A "cet objet"
// Maintenant, il y a deux références à "cet objet", l'un est O2 et l'autre est OA
o2 = "yo"; // L'objet d'origine est maintenant nul référence
// il peut être recyclé
// Cependant, l'objet de sa propriété a est toujours référencé par OA, il ne peut donc pas encore être recyclé
OA = null; // L'objet avec la propriété A est désormais également référencé par zéro
// il peut être collecté aux ordures
Limitation: référence de recyclage
Cet algorithme simple a une limitation que si un objet se réfère à un autre (formant une référence circulaire), ils peuvent "n'en ont plus besoin", mais ils ne seront pas recyclés.
La copie de code est la suivante:
fonction f () {
var o = {};
var o2 = {};
OA = O2; // o référence O2
o2.a = o; // O2 Citations o
retourner "Azerty";
}
f ();
// Deux objets sont créés et référencés l'un à l'autre, formant une boucle
// ils ne quitteront pas la portée de la fonction après avoir été appelée
// donc ils sont inutiles et peuvent être recyclés
// Cependant, l'algorithme de comptage de référence prend en compte qu'ils ont des références au moins une fois, de sorte qu'ils ne seront pas recyclés
Exemples pratiques
IE 6, 7 Recyclage du comptage de référence sur les objets DOM. Un problème commun pour eux est les fuites de mémoire:
La copie de code est la suivante:
var div = document.CreateElement ("div");
div.onclick = function () {
Dosomething ();
};
// Div a une référence pointant vers la propriété de traitement des événements OnClick
// La gestion des événements a également une référence à la div qui peut être accessible dans la portée de la fonction
// Cette référence circulaire entraînera la collecte des deux objets
Algorithme de compensation de marque
Cet algorithme simplifie "si l'objet n'est plus nécessaire" comme "si l'objet est disponible".
Cet algorithme suppose que la définition d'un objet appelé root (en javascript, root est un objet global). Régulièrement, le collecteur des ordures commencera à la racine, trouvera tous les objets référencés à partir de la racine, puis trouvera les objets référencés par ces objets ... à partir de la racine, le collecteur de déchets trouvera tous les objets qui peuvent être obtenus et tous les objets qui ne peuvent pas être obtenus.
Cet algorithme est meilleur que le précédent, car "les objets avec zéro références" ne sont toujours pas disponibles, mais au contraire, il n'est pas nécessairement vrai, se référer à "références circulaires".
Depuis 2012, tous les navigateurs modernes ont utilisé l'algorithme de collecte de déchets Tag-Clean. Toutes les améliorations de l'algorithme de collecte JavaScript Garbage sont basées sur des améliorations à l'algorithme de nettoyage de balises, sans améliorer l'algorithme de nettoyage de balise lui-même et sa définition simplifiée de la question de savoir si l'objet n'est plus nécessaire.
Les références circulaires ne sont plus un problème
Dans l'exemple ci-dessus, après le retour de l'appel de fonction, les deux objets ne peuvent pas être récupérés de l'objet global. Par conséquent, ils seront recyclés par le collecteur des ordures.
Le deuxième exemple également, une fois que la div et son traitement d'événements ne peuvent pas être récupérées de la racine, ils seront recyclés par le collecteur des ordures.
Limitation: les objets doivent être explicitement indisponibles
Bien que ce soit une limitation, il est rarement percé, c'est pourquoi en réalité, peu de gens se soucient du mécanisme de collecte des ordures.