Comprendre le garbage collection de Java avec des références circulaires
Le garbage collection en Java est chargé de libérer automatiquement la mémoire occupée par les objets qui ne sont plus dans utiliser par toutes les références en direct. Bien que ce mécanisme élimine généralement la consommation inutile de mémoire, il peut rencontrer des problèmes lorsqu'il s'agit de références circulaires.
Considérez le code suivant :
class Node { public object value; public Node next; public Node(object o, Node n) { value = o; next = n;} } //...some code { Node a = new Node("a", null), b = new Node("b", a), c = new Node("c", b); a.next = c; } //end of scope //...other code
Dans ce scénario, les objets a, b et c former une référence circulaire (a pointe vers c, c pointe vers b et b pointe vers a). Selon les principes traditionnels du garbage collection, ces objets doivent être marqués comme inaccessibles, car aucune référence active n'existe en dehors de la portée dans laquelle ils ont été créés. Cependant, ils semblent être référencés dans la boucle circulaire.
La solution Java aux références circulaires
Le ramasse-miettes de Java traite les références circulaires en utilisant une analyse d'accessibilité plus sophistiquée. Il exploite l'idée d'objets « accessibles » et « inaccessibles ».
Un objet est considéré comme accessible s'il est directement ou indirectement référencé à partir d'une « racine de garbage collection ». Les racines du garbage collection incluent des variables globales, des références stockées dans des registres de threads et des références détenues par la JVM elle-même.
Dans l'exemple donné, les objets a, b et c sont initialement accessibles lorsqu'ils sont créés dans la portée. Cependant, une fois la portée terminée (lorsque les accolades se ferment), toutes les références extérieures à ces objets sont supprimées. Ils deviennent inaccessibles depuis la racine du garbage collection.
Récupération des références circulaires inaccessibles
Maintenant que a, b et c sont inaccessibles, les garbage le collecteur peut les identifier comme des déchets potentiels. Il déclenche une opération de marquage et de balayage où :
De cette manière, le garbage collector Java interrompt le cycle de référence circulaire et libère la mémoire occupée par a, b et c, même s'ils pointent chacun vers l'autre. autre.
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!