2009-07-08 13 views
25

Je comprends et j'apprécie l'utilité de la classe System.WeakReference dans le framework .NET, mais je suis curieux quant aux détails d'implémentation.Implémentation de WeakReference dans .NET

Comment WeakReference est-il implémenté dans .NET? MSDN discute de l'utilisation de WeakReference en détail, mais a peu de détails que j'ai vu sur comment cela fonctionne sous le capot.

Comment le CLR suit-il la référence et sait annuler le handle interne lorsque la cible est collectée, sans empêcher le GC? Cela nécessite-t-il une manipulation spéciale dans le CLR lui-même? Ma principale préoccupation serait de savoir si l'utilisation de WeakReferences (en particulier si vous en utilisez plusieurs) a des implications sur les performances qui diffèrent de celles de l'utilisation de références d'objet standard.

+5

J'ai depuis fait beaucoup de recherche, et blogué sur mes résultats en détail: http://reedcopsey.com/?p=50 –

Répondre

19

La classe WeakReference transmet sa référence d'objet au GC et récupère un handle. Chaque fois que vous obtenez la référence ou vérifiez si la référence est en vie, le handle est utilisé pour demander la référence au GC. Cela signifie que le GC conserve une liste de toutes les références faibles, qu'il doit mettre à jour lorsque des objets sont collectés. Cela signifie également qu'il y a des frais généraux chaque fois que vous utilisez une référence faible. Donc, chaque référence faible signifie un peu plus de travail pour le garbage collector, mais d'un autre côté, chaque référence régulière aussi, même si c'est moins. Vous devriez bien sûr faire attention à utiliser beaucoup de références faibles, mais si vous avez besoin de cela pour que la gestion de la mémoire fonctionne bien avec vos objets, cela devrait surpasser le léger surcoût qu'elle provoque.

+1

Je vais définir ceci comme la réponse car c'est une bonne description du processus. Merci Guffa. –

13

Vous avez mentionné MSDN; avez-vous déjà vu cet article?

http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

Consultez également le chapitre 19 "Programmation appliquée Microsoft .NET Framework" par le même auteur (Jeffrey Richter). Le chapitre est sur la collecte des ordures et a une section sur les internes de WeakReference. En général, si vous accédez à beaucoup de Targets dans WeakReferences, il y a une baisse de performance simplement parce que WeakRef fonctionne (surtout pour la sécurité des threads) avant de retourner la cible. Ce n'est évidemment pas aussi bon marché que d'utiliser la référence d'un objet directement. D'un autre côté, vous gagnez des performances lorsque vous stockez des références à des objets volumineux, car le garbage collector a plus d'options lorsque des considérations de mémoire surviennent.

Je n'ai jamais essayé de quantifier ce compromis, ou de connaître des références ici. Évidemment, cela varie quelque peu en fonction de l'application.

+2

+1, et merci pour le matériel de référence. Juste FYI, j'ai fait plus de recherches, et il y a étonnamment peu de surcharge pour la sécurité des threads dans WeakReference - la plupart du temps, il faut que GCHandle rende l'objet, qui agit comme déréférencement deux fois, plus quelques vérifications nuls. –

+0

Je pensais me souvenir d'avoir vu ça il y a quelques années, mais j'aurais vraiment dû le confirmer avant de le mettre dans la réponse. Merci d'avoir remarqué ça, Reed. – ars

+0

+1 pour le matériel de référence pratique. –