2009-05-12 13 views

Répondre

19

Les objets référencés par des variables statiques ne seront collectés que lorsque AppDomain sera collecté. Dans les applications client, il n'y a souvent qu'un seul AppDomain qui vit pendant toute la durée du processus. (Une exception est lorsque l'application utilise une architecture de plug-in. - plug-ins différents peuvent être chargés dans les différentes AppDomainAppDomain s et peuvent être déchargées plus tard)

Dans ASP.NET, "AppDomain recyclage" se produit périodiquement (pour diverses raisons) - lorsque cela se produit, et les variables statiques au sein de cette AppDomain n'agiront plus comme des racines GC, et n'empêcheront donc pas les objets d'être collectés.

Si vous étiez préoccupé par le fait qu'un objet soit collecté alors que vous aviez toujours une référence via une variable statique, vous pouvez vous détendre. Bien que vous puissiez accéder à l'objet, il ne sera pas collecté.

+0

Cela ne crée-t-il pas une grande inefficacité? Je crée souvent des méthodes auxiliaires statiques privées. Ou, toutes les méthodes d'extension. Je me demande combien de mémoire ces consomment-ils? Si j'ai une méthode d'aide pour un objet, est-il préférable de simplement laisser l'assistant en tant qu'instance pour qu'elle soit collectée? –

+0

@ P.Brian.Mackey: Si vous avez des méthodes statiques, quel souvenir imaginez-vous consommé? Si vous avez des variables * statiques *, vous avez un état global, ce qui est souvent une mauvaise idée pour commencer. Mais les méthodes elles-mêmes sont différentes. –

+0

Mon erreur. J'ai supposé que les méthodes sont créées sur la pile/tas comme les variables. Apparemment, ce n'est pas le cas. –

5

Les membres ne sont pas collectés ... Les objets sont.
Donc, si vous définissez la Réf. Tapez static member to null, tout objet sur lequel il pointait précédemment serait collecté. Si ce n'est pas le cas, il restera jusqu'à ce que l'AppDomain tombe en panne (chaque AppDomain a son propre ensemble de trucs statiques)

0

Un membre statique d'un type de référence est une référence qui peut ou non pointer vers une instance. Si elle pointe vers une instance, cette instance ne sera pas collectée tant que le membre statique n'aura pas été déchargé. Si le type est chargé dans un AppDomain spécifique, cela peut être déchargé. Sinon, cela ne se produit que lorsque l'application est terminée.

1

La réponse courte ... Non; Toutes les implémentations actuelles du garbage collector .NET ne collecteront pas d'objets fortement référencés par les champs de membres de classe statiques, jusqu'à ce que le domaine d'application auquel sont associées les références fortes du champ membre de classe statique soit détruit.

La réponse la plus longue ... Potentiellement oui; le garbage collector fonde sa décision de collecter un objet sur l'accessibilité de l'objet, et non sur des références (fortes ou faibles) à l'objet. En théorie, si le garbage collector pouvait déterminer qu'aucun code n'exigerait à nouveau un certain objet à partir d'un certain point (c'est-à-dire que l'objet n'est pas accessible depuis un chemin de code), le GC serait autorisé à collecter cet objet. si elle était encore fortement référencée par les champs de membres de classe statiques. Ceci est parfaitement autorisé, puisque vous ne le remarquerez jamais, car aucun code n'essaiera jamais d'accéder au champ de membre de classe statique qui contient la référence à l'objet. Vous pourriez demander, alors pourquoi est-ce que je m'inquiète si je ne vais jamais accéder à l'objet à nouveau via l'une des références fortes que je tiens à lui? La raison pour laquelle vous vous en souciez est des effets secondaires. Par exemple, vous pourriez supposer en assignant une zone de membre de classe statique une référence à un objet SafeHandle, représentant une ressource non managée, que l'objet SafeHandle ne serait jamais fermé et conserverait ainsi l'objet non managé qu'il représente vivant. Cela n'est vrai que pour les implémentations actuelles du GC. Une implémentation future du GC pourrait collecter des objets fortement référencés par des champs de membres de classe statiques si ces objets n'étaient plus accessibles par aucun code de programme restant.

Questions connexes