Question

Je me demande comment faibles références fonctionnent en interne, par exemple dans .NET ou Java. Mes deux idées générales sont:

  1. « intrusives » - d'ajouter la liste des références faibles à la classe la plus haut (classe d'objets). Ensuite, lorsqu'un objet est détruit, toutes les références faibles peuvent être réitérés et des valeurs nulles.
  2. « non intrusif » - pour maintenir une table de hachage des pointeurs de objets à des listes de références faibles. Quand une référence faible A est créé pour un objet B, il y aurait une entrée dans la table de hachage modifié ou créé, dont la clé serait le pointeur B.
  3. « sale » - pour stocker une valeur de hachage spéciale à chaque objet, qui serait remis à zéro lorsque l'objet est détruit. Références faibles copiaient que la valeur de hachage et se comparer avec la valeur de l'objet pour vérifier si l'objet est vivant. Ce serait cependant provoquer des erreurs de violation d'accès, lorsqu'il est utilisé directement, donc il y aurait besoin d'être un objet supplémentaire que la valeur de hachage, je pense.

Chacune de ces solutions semble propre, ni efficace. Est-ce que quelqu'un sait comment il est réellement fait?

Était-ce utile?

La solution

Je ne sais pas bien compris votre question, mais vous pouvez jeter un oeil à la mise en œuvre de la WeakReference de classe et sa superclasse référence en Java. Il est bien commenté et vous pouvez le voir a un champ traité spécialement par le GC et l'autre utilisé directement par la machine virtuelle.

Autres conseils

Dans .NET, lorsqu'un WeakReference est créé, le GC est demandé pour une poignée / jeton opaque représentant la référence. Ensuite, en cas de besoin, WeakReference utilise cette poignée pour demander au GC si cette poignée est toujours valable (à savoir l'objet original existe encore) -. Et si oui, il peut obtenir la référence de l'objet réel

Donc, c'est la construction d'une liste de jetons / poignées contre les adresses des objets (et sans doute le maintien de cette liste au cours Défragmentation etc)

Je ne suis pas sûr que je comprends que je 100% les trois balles, donc hésite à deviner quel (le cas échéant) qui est le plus proche de.

Il semble que la mise en œuvre de la faiblesse des références est secret bien gardé dans l'industrie ;-). Par exemple, à partir de maintenant, wikipedia article manque de détails de mise en œuvre. Et regardez les réponses ci-dessus (y compris le accepté). « Aller chercher à la source » ou « je pense »; - \

De toutes les réponses, seule une référence PEP 205 Python est perspicace. Comme il est dit, pour tout objet unique, il peut y avoir au plus une référence faible, si nous traitons weakref comme une entité elle-même.

Le reste décrit l'implémentation du langage écureuil. Ainsi, weakref lui-même est un objet, lorsque vous mettez référence faible à un objet dans un certain conteneur, vous mettez en fait référence à weakref objet. Chaque objet ref dénombrable a champ pour stocker pointeur sur son weakref, qui est NULL jusqu'à ce que weakref à cet objet est effectivement demandé. Chaque objet a procédé à demander weakref, qui soit des rendements weakref existant (singleton) à partir du terrain, ou il crée et caches dans le champ.

Bien sûr, les points weakref à l'objet original. Donc, vous avez juste besoin de passer par toutes les places disponibles où les références à des objets sont manipulés et ajouter la gestion transparente des weakrefs (à savoir automatiquement déréférencer). (Méthode « Transparent » alternative est d'ajouter « d'accès » virtuel qui sera identité pour la plupart des objets et déréférencer réelle pour weakref.)

Et comme objet a pointeur sur son weakref, l'objet peut annuler le weakref dans son propre destructor.

Cette mise en œuvre est assez propre (pas magique « remet en GC » et d'autres choses) et O (1) Coût d'exécution. Bien sûr, il est assez gourmand de la mémoire - besoin d'ajouter le champ +1 pointeur sur chaque objet, même si généralement pour 90 +% des objets qui seraient NULL. Bien sûr, VHLLs ont déjà grande surcharge de mémoire par objet, et il peut y avoir la chance de compacter différents champs « extra ». Par exemple, le type d'objet est généralement une petite énumération, il peut être possible de fusionner type et une sorte de référence weakref en seul mot de la machine (par exemple, garder des objets weakref dans une arène séparée, et l'indice utiliser pour cela).

PEP 205 a une explication décente de la façon dont les références faibles devraient se comporter en Python, et cela donne un aperçu de la façon dont ils peuvent être mis en œuvre. Étant donné qu'une référence faible est immuable, vous pourriez avoir un seul pour chaque objet, auquel vous passez des références au besoin. Ainsi, lorsque l'objet est détruit, une seule référence faible doit être invalidée.

L'approche normale, je pense, est pour le système de maintenir une sorte de liste de références faibles. Lorsque le garbage collector exécute, avant que les objets morts sont enlevés, les itère du système à travers la liste des références faibles et invalident toute référence dont la cible n'a pas été marqué en direct. En fonction du système, cela peut se produire avant ou après que le système temporairement des objets qui ressuscite sont admissibles à la finalisation immédiate (dans le cas de .net, il existe deux types de WeakReference - dont une est effectivement traitée avant que les analyses du système pour finalizers , ce qui signifie qu'elle deviendra invalide lorsque sa cible devient admissible à la finalisation, et l'un qui est traité après).

Par ailleurs, si je la conception d'un cadre fondé sur gc, je voudrais ajouter quelques autres goodies: (1) un moyen de déclarer un type de référence emplacement de stockage en tenant une référence qui est principalement d'intérêt à quelqu'un d'autre, et (2) une variété de WeakReference qui pourrait indiquer que les seules références à un objet sont « d'intérêt pour quelqu'un d'autre » lieux de stockage. Bien que WeakReference est un type utile, l'acte de transformer une référence faible en une référence forte peut empêcher le système de jamais reconnaître que personne ne l'esprit si sa cible a disparu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top