J'échangeais des moyens de me débarrasser de quelques fuites de mémoire dans mon application l'autre jour où je me suis rendu compte que je ne sais pratiquement rien sur le nettoyage de mes ressources. J'ai fait des recherches et j'ai espéré que juste appeler le .Dispose () résoudrait tous mes problèmes. Nous avons une table dans notre base de données contenant environ 65 000 enregistrements. Évidemment, lorsque je remplis mon ensemble de données de l'adaptateur de données, l'utilisation de la mémoire peut être assez élevée. Lorsque j'ai appelé la méthode d'expulsion sur le jeu de données, j'ai été surpris de savoir qu'aucun de la mémoire ne s'est libéré. Pourquoi est-ce arrivé? Effacement de l'ensemble de données n'aide pas non plus. P>
4 Réponses :
Calling Dispose () libérera uniquement des ressources non gérées, telles que des poignées de fichier, des connexions de base de données, une mémoire non gérée, etc. Il sera La mémoire collectée à la poubelle ne sera sortie que lors de la prochaine collection. Habituellement, lorsque la mémoire de domaine d'application est maximale. P>
Idisposable et donc Dispose n'est pas utilisé pour réduire la pression de la mémoire, bien que dans certains cas Cela pourrait, mais utilisé à la place pour un nettoyage déterministe. P>
Considérez ceci, vous construisez un objet qui maintient une connexion active et ouverte à votre serveur de base de données. Cette connexion utilise des ressources, à la fois sur votre machine et le serveur. P>
Vous pouvez bien sûr juste quitter l'objet être lorsque vous en avez fini, et éventuellement, cela sera ramassé par le collecteur des ordures, mais supposons que vous souhaitiez que au moins, les ressources soient libérées, et donc la Connexion fermée, lorsque vous en avez terminé. C'est ici que Idisposable . Dispose entre en jeu. P>
Il est utilisé pour nettoyer les ressources gérées par l'objet. P>
Ce sera cependant pas libéré de la mémoire gérée allouée à l'objet. Ceci reste toujours à la poubelle, qui va frapper à un peu plus tard pour le faire. P>
Avez-vous réellement un problème de mémoire, ou viens-vous simplement de regarder l'utilisation de la mémoire dans le responsable des tâches ou similaire et allez "c'est un peu élevé."? P>
Si ce dernier, vous devriez simplement le laisser soit pour le moment. .NET dirigera plus souvent la collection de déchets si vous avez moins de mémoire disponible, alors que vous n'êtes donc pas dans une situation où vous obtenez, ou peut vous suspecter que vous aurez bientôt, une condition de débordement de mémoire, vous n'aurez probablement pas de problèmes . P>
Permettez-moi d'expliquer ce que je veux dire par "courir moins souvent". P>
Si vous avez 8 Go de mémoire dans votre machine et que Windows et Bloc-notes fonctionnent, la plupart de cette mémoire seront disponibles. Lorsque vous exécutez maintenant votre programme, même si elle charge des blocs de données mineurs en mémoire, vous pouvez continuer à le faire pendant une longue période et la consommation de mémoire augmentera régulièrement. Exactement lorsque le GC va commencer et essayer de réduire votre empreinte mémoire que je ne sais pas, mais je peux presque vous garantir que vous vous demanderez pourquoi cela devient si élevé. P>
Ne faites que pour l'argument, disons que votre programme utilisera éventuellement 2 Go de mémoire. P>
Maintenant, si vous exécutez votre programme sur une machine moins de mémoire disponible, GC se produira plus souvent et sera lancé sur une limite inférieure, ce qui pourrait conserver l'utilisation de la mémoire inférieure à 500 Mo ou éventuellement moins. P >
La partie importante à noter est que pour que vous puissiez obtenir une image précise de la quantité d'application de la mémoire requiert em>, vous ne pouvez pas compter sur le gestionnaire de tâches ou les mêmes façons de la mesurer , vous avez besoin de quelque chose de plus ciblé. P>
Mon programme peut accéder à 700.164k. Pas bon compte tenu de mes clients pourraient avoir des ordinateurs d'extrémité inférieure.
Ce qui signifie que vous n'avez pas lu ma réponse. Essayez de charger plusieurs grandes applications afin qu'avant de démarrer votre propre programme, vous avez moins de 700.164K mémoire disponible (y compris la mémoire virtuelle). Ensuite, essayez de le charger, cela fonctionnera probablement toujours, à moins que vous ne preniez plus que celui des données en mémoire pour l'utilisation, auquel cas GC ne vous aidera pas du tout, il vous suffit de réduire la quantité de données que vous traitez. n'importe quand.
Je vais souligner quelque chose ici qui n'a pas été explicitement mentionné: appeler Ce que je veux dire, c'est ceci: Si vous soupçonnez que vous avez une fuite de mémoire, appeler Dispose () code> ne nettoie que (gratuit) des ressources non gérées si le développeur du composant l'a codé. p>
Dispose () code> ne va pas le réparer si le développeur d'origine a effectué un travail moche et non correctement Ressources non gérées libérées em>. Pour un peu plus d'informations, Vérifiez ce blog Publier . Prenez note de la déclaration Le comportement du dispositif est défini par le développeur. I> p>
Certains objets demanderont une ou plusieurs autres entités de faire quelque chose en son nom jusqu'à ce que le préavis, au détriment des autres entités. Si un objet qui l'avait fait disparaître sans informer les anciennes entités que leurs services n'étaient plus nécessaires, ces entités continueraient d'agir inutilement pour le compte d'un objet qui ne les avaient plus nécessaire, au détriment persistant d'autres entités qui voudraient pour les utiliser. p>
Dans de nombreux cas, pour un objet "George" de raconter une entité extérieure "Joe" que ses services n'étaient plus nécessaires, George devrait savoir que Ses services i> n'ont plus besoin. Il y a deux moyens normaux via lesquels cela peut se produire dans .NET, finalisation et Si un objet remplace une méthode appelée Bien que le nettoyage basé sur la finalisation puisse parfois fonctionner, il n'y a aucune garantie de rapidité. À un moment donné, lors de la conception de .NET Microsoft a peut-être pu vouloir que la finalisation soit la méthode de nettoyage primaire, mais pour une variété de raisons, il ne peut pas être invoqué en toute sécurité. P>
L'autre approche de nettoyage, qui devrait être au centre de ses efforts, est Notez que Idisposable code>. P>
finaliser code>, alors lorsque l'objet est créé, le collecteur de poubages .NET l'ajoutera à une liste d'objets avec des finaliseurs enregistrés. Si le GC découvre qu'il n'existe aucune référence enracinée à l'objet autre que cette liste, le GC supprimera l'objet de cette liste et l'ajoutez à une file d'attente fortement enracinée d'objets qui devraient avoir leur
finaliser code> méthode appelée dès que possible. Un tel objet peut ensuite utiliser sa méthode
finaliser code> pour informer d'autres entités que leurs services ne sont plus nécessaires. P>
Idisposable code>. Fondamentalement, l'idée derrière
Idisposable code> est simple: pour chaque objet qui implémente
Idisposable code>, il devrait y avoir une entité (généralement un objet ou une périmètre d'exécution imbriquée) responsable de veiller à ce que cet objet
iDisposable.Dispose code> méthode sera appelé dans la durée de vie de l'univers (qui impliquerait un jour alors qu'une référence à l'objet existe toujours), et de préférence dès que le code peut dire que le code peut dire que Les services de l'objet ne seront plus nécessaires. P>
Idisposable.Dispose code> promet généralement que toutes les entités extérieures qui avaient été invitées à faire quelque chose sur le compte d'un objet seront informées qu'ils n'ont plus besoin de le faire, mais une telle promesse ne fait pas impliquer que le nombre d'entités est non nulle. Si un objet n'a pas demandé aux entités extérieures de faire quoi que ce soit en son nom, la livraison de "toutes" telles entités ne nécessitent rien du tout. D'autre part, le fait qu'un
dispose de la méthode code> ne peut rien faire dans certains cas ne signifie pas que c'est garanti de ne jamais faire quoi que ce soit, ni ce défaut de l'appeler dans ces cas où il ferait quelque chose n'aura pas d'effets néfastes. P>