Les membres statiques seront-ils jamais collectés par le garbage collector?Garbage collection de membres statiques
Répondre
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 AppDomain
AppDomain
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é.
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)
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.
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.
- 1. Garbage Collection
- 2. Loops and Garbage Collection
- 3. Garbage garbage collection de code généré à l'exécution
- 4. Force Garbage Collection dans AS3?
- 5. Garbage Collection en C++/CLI
- 6. et fichier temporaire Garbage Collection
- 7. Crash Collection Garbage utilisant NSImage
- 8. membres statiques dans VB.NET
- 9. Serait-ce causer des problèmes Garbage Collection
- 10. membres statiques et augmentation de la sérialisation
- 11. espaces de noms (statiques) variables membres
- 12. C# réflexion et l'héritage des membres statiques
- 13. Héritage des membres statiques dans PHP
- 14. spécialisation de modèle pour les fonctions membres statiques; comment?
- 15. Garbage collection dans Flex lorsque removeChild() est appelé - gestion des conditions de course
- 16. Comment faire pour rediriger la sortie de garbage collection verbeux dans un fichier?
- 17. Pourquoi ne puis-je pas utiliser des membres statiques, par exemple des structures statiques, dans mes classes de VS2008?
- 18. Xcode: Garbage Collector Setting
- 19. Garbage Collector Flash Player
- 20. Garbage Collector asp.net
- 21. Pourquoi les propriétés de dépendance .Net WPF doivent-elles être des membres statiques de la classe
- 22. Variables statiques dans ASP.NET
- 23. Utilisation de ThreadLocal avec des classes existantes qui contiennent des membres statiques
- 24. Contrôle du garbage collector de Lua5.1
- 25. Voyant Garbage lors de l'utilisation Bison
- 26. Problème de mappage nHibernate - Impossible de supprimer les membres d'une collection
- 27. Membres de SetWindowsHookEx, KeyboardProc et non-static
- 28. Qt tr ne semble pas fonctionner sur les membres constants statiques?
- 29. Quels garbage collectors sont disponibles pour C++?
- 30. J'ai entendu que Python a automatisé "garbage collection", mais pas C++. Qu'est-ce que ça veut dire?
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? –
@ 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. –
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. –