J'ai entendu dire que c # ne libère pas de mémoire tout de suite, même si vous en avez terminé. Puis-je forcer c # à la mémoire libre? p>
J'utilise Visual Studio 2008 Express. Est-ce que cela importe? P>
P.s. Je n'ai pas de problèmes avec C # et comment il gère la mémoire. Je suis juste curieux. P>
5 Réponses :
Vous pouvez forcer le collecteur à ordures à collecter un objet non référencé via la méthode
GC.Collect()
Jim,
Vous avez entendu correctement. Il nettoie la mémoire de la mémoire périodiquement à travers un mécanisme appelé collecteur à ordures. Vous pouvez "forcer" la collection à la poubelle à travers un appel comme celui ci-dessous. P> Je vous recommande vivement de lire Cet article MSDN sur la collection de déchets . P> Editer 1:" Force "était entre guillemets. Pour être plus clair car une autre affiche était, cela ne le suggère vraiment que. Vous ne pouvez pas vraiment y arriver à un moment donné. D'où le lien vers l'article sur la collection de déchets en .NET P> EDIT 2: J'ai réalisé que tout le monde ici n'a fourni qu'une réponse directe à votre question principale. Quant à votre question secondaire. Utilisation de Visual Studio 2008 Express utilisera toujours le .NET Framework, c'est ce qui effectue la collecte des ordures. Donc, si vous améliorez jamais vers l'édition professionnelle, vous aurez toujours les mêmes capacités / limitations de gestion de la mémoire. P> EDIT 3: Ce Wikipedia Aritcles sur les finaliseurs donne de bons pointeurs de ce qui convient à faire dans un finisseur. Fondamentalement, si vous créez un objet qui a accès à des ressources critiques, ou si vous consommez un tel objet, implémentez Idisose et / ou profitez de l'instruction à l'aide de em>. L'utilisation appelle automatiquement la méthode Dispose, même lorsque des exceptions sont lancées. Cela ne signifie pas que vous n'avez pas besoin de donner aux finalisateurs d'exécution indiquer ... p> p>
Merci. Beaucoup d'informations là-bas. Bon article, en particulier Depuis que je viens d'un contexte C ++.
Vous ne pouvez pas force em> C # à la mémoire libre, mais vous pouvez demande em> que le CLR transmet des objets non référencés en appelant System.GC.Collect();
Gc.RunFinalizers? où est-ce que c'est? Je ne trouve pas ça dans mon vs 2010 c # 4.0
@Imranrizvi - Apparemment, il a été supprimé il y a longtemps - Stackoverflow.com/a/12565583/59303 .
Vous voudrez peut-être jeter un coup d'œil à cette
Vous pouvez nettoyer votre mémoire en donnant à la fois des méthodes: lisez les deux référence gc.collect () et gc.waitforpendendSeinalisateurs () p> p>
Et cela fonctionne-t-il réellement? Quelqu'un a essayé? Ou est-ce une légende urbaine étant passée autour de la vérité?
Arrête ça. Ne pas. Laisser seul. Ne osez-vous pas. Non, pas le vôtre. Vacher, pensez à autre chose.
@Sera. Touché sur un endroit douloureux l'a-t-il?
@Jim sauf si vous êtes un expert et sachez ce que vous faites, je ne le ferais pas. Même comme un expert, je ne le ferais pas. Si vous trouvez vous-même avoir besoin d'appeler le GC, je parierais qu'il y a un autre problème ... c'est-à-dire une fuite de mémoire i>.
@CHARLES, si vous avez un service de course à long terme, ou une fonction CLR dans SQL- - une des tonnes de textes de texte, un environnement de serveur 24x7, vous aurez la nécessité de le faire ... cela ne devrait pas être fait Libéralement comme c'est une opération coûteuse, mais il y a le besoin occasionnel.
IIRC GC.Collect prendra des objets pas i> due à être collectés et de les promouvoir à la prochaine génération, où ils sont moins i> susceptibles d'être collectés la prochaine fois.
Jason D. Pourquoi montre-t-il que vous avez édité mon poste? Je ne vois aucun changement ...
En raison de la collecte, faites-vous des idées sans références ou y a-t-il une autre heuristique que le collectionneur des ordures utilise?
@Jason D: Je trouve votre affirmation que vous i> doit faire cela plutôt audacieux. J'ai écrit des services 24x7 à long terme qui ne l'ont pas tenu du tout. Où et pourquoi trouvez-vous le besoin?
@Jason D - Nous écrivons beaucoup de services Windows à long terme et n'ont jamais besoin de toucher le GC.
@Jon Skeet, comme je l'ai dit avant que ce soit une fonction SQL CLR. Il fonctionne sous SQL 2005 et comme je l'ai indiqué avant de procéder à des tonnes de texte à la fois. Je n'ai pas écrit les Thigs, une collègue l'a fait. Il a constaté que cela manquerait de la mémoire SQL CLR sauf si GC.Collect n'était appelé périodiquement (c'est-à-dire pas tout le temps ... mais plus que jamais), il est une personne très approfondie. Je fais confiance à son évaluation. @Joe. Merci d'avoir partagé.
@JIM - Pour répondre à votre commentaire sur les changements de Jason D - Il a ajouté la balise
.net code>.
Dupliqué possible de Comment forcer le collecteur à ordures à courir?