Pourquoi avez-vous besoin de comprendre les stratégies et les principes du GC ?
La raison a en fait été évoquée dans le chapitre précédent. C'est parce que dans le travail et la recherche quotidiens, il est inévitable de rencontrer des problèmes de débordement de mémoire et de fuite de mémoire. Si vous rencontrez les problèmes mentionnés ci-dessus sans comprendre la stratégie et les principes du GC, les gens se sentiront souvent perdus.
Une fois que nous avons compris les connaissances pertinentes, même si parfois nous ne pouvons toujours pas résoudre le problème rapidement, ce qui est sûr, c'est qu'au moins nous ne serons pas perdus.
Quels problèmes la stratégie GC résout-elle ?
Puisque le GC automatique doit être réalisé, il doit y avoir des stratégies correspondantes. Quels problèmes ces stratégies résolvent-elles ? En gros, les principaux points sont les suivants.
1. Quels objets peuvent être recyclés.
2. Quand recycler ces objets.
3. Quelle méthode de recyclage est utilisée.
[b]Quel algorithme est utilisé dans la stratégie GC[/b]
Concernant les trois questions mentionnées ci-dessus, en fait, la question la plus importante est la première, qui est de savoir quels objets sont recyclables.
Il existe une méthode relativement simple et intuitive, plus efficace, appelée algorithme de comptage de références. Cependant, cet algorithme présente un défaut fatal : il ne peut pas recycler les objets ayant des références circulaires. Imaginez que si la JVM adopte cette stratégie GC, alors lorsque les programmeurs écrivent des programmes, un code comme celui-ci ne devrait pas réapparaître.
public class Object { Object field = null; public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run() { Object objectA = new Object(); Object objectB = new Object();//1 objectA.field = objectB; objectB.field = objectA;// //to do something objectA = null; objectB = null;//3 } }); thread.start(); while (true); } }
Ce code semble un peu délibéré, mais en fait, il se produit souvent dans le processus de programmation réel, comme deux objets de base de données avec une relation un-à-un, chacun maintenant une référence à l'autre . La dernière boucle infinie sert simplement à empêcher la JVM de se fermer et n'a aucune signification pratique.
Pour le GC que nous utilisons actuellement, à la fin du thread, objectA et objectB seront utilisés comme objets à recycler. Et si notre GC adopte l'algorithme de comptage de références évoqué ci-dessus, ces deux objets ne seront jamais recyclés, même si on classe explicitement les objets comme nuls après utilisation, cela n'aura aucun effet.
Voici une brève explication de LZ. Dans le code, LZ a marqué les trois nombres 1, 2 et 3. Une fois l'instruction exécutée en premier lieu, les comptes de référence des deux objets sont tous 1. Lorsque l'instruction en deuxième lieu est exécutée, les comptes de référence des deux objets deviennent tous 2. Une fois l'instruction en troisième lieu exécutée, c'est-à-dire une fois que les deux ont été classées comme valeurs nulles, les décomptes de référence des deux sont toujours 1. Selon les règles de recyclage de l'algorithme de comptage de références, le décompte de références ne sera recyclé que lorsqu'il atteint 0.
Algorithme de recherche racine
En raison des défauts de l'algorithme de comptage de références, JVM utilise généralement un nouvel algorithme appelé algorithme de recherche racine. Sa méthode de traitement consiste à configurer plusieurs objets racine. Lorsqu'un objet racine est inaccessible à un certain objet, l'objet est considéré comme recyclable.
Prenons l'image ci-dessus comme exemple, ObjectD et ObjectE sont liés l'un à l'autre, mais comme les racines GC ne sont pas accessibles à ces deux objets, D et E seront toujours finalement supprimé. En tant qu'objets GC, si la méthode de comptage de références est utilisée dans la figure ci-dessus, aucun des cinq objets A-E ne sera recyclé.
En parlant de racines GC, dans le langage JAVA, les objets suivants peuvent être utilisés comme racines GC :
1. Objets référencés dans la pile de la machine virtuelle.
2. L'objet référencé par l'attribut statique de classe dans la zone de méthode.
3. L'objet référencé par la constante dans la zone méthode.
4. L'objet référencé par JNI dans la pile de méthodes locale.
Les première et quatrième méthodes font toutes deux référence à la table des variables locales de la méthode. La deuxième expression a une signification plus claire. La troisième méthode fait principalement référence à la valeur constante déclarée comme finale.
Algorithme de collecte des ordures
L'algorithme de recherche racine résout le problème de base de la collecte des ordures, qui est le premier problème mentionné ci-dessus et le problème le plus critique, quels objets peuvent être recyclés.
Cependant, la collecte des déchets doit évidemment encore résoudre les deux derniers problèmes, quand recycler et comment recycler. Sur la base de l'algorithme de recherche racine, il existe trois principaux algorithmes de garbage collection dans la mise en œuvre des machines virtuelles modernes, à savoir l'algorithme d'effacement des marques, l'algorithme de copie et l'algorithme de tri des marques. Ces trois algorithmes étendent tous l’algorithme de recherche racine, mais ils restent très faciles à comprendre.
Conclusion
Ce qui précède est le contenu de la gestion de la mémoire JVM------Introduction à GC Pour plus de contenu connexe, veuillez prêter attention au site Web PHP chinois (www.php. cn) !