2010-09-24 11 views
2

Comment puis-je intentionnellement déborder ma mémoire pour forcer le ramassage des ordures? Quelqu'un peut-il proposer algorithme comme celui-ci:Dépasser ma mémoire, pour forcer le ramasse-miettes?

while (garbage collector starts) { 
     overflow my memory with something easily disposable 
} 

Edit: Pour que tout le monde purposed méthode GC.Collect. J'ai toujours pensé, que GC ne peut pas être forcé de se produire par programme. Devinez, j'avais tort. Merci pour les réponses.

+1

Je doute que vous obtiendrez des réponses sur celui-ci, mais avez-vous envisagé d'utiliser 'GC.Collect()'? ;) – recursive

+1

Dans le cas où vous avez un problème avec l'utilisation de la mémoire, je peux conseiller excellent outil SciTech Memory profiler. Il permet de suivre ce qui se passe et montre pourquoi l'objet n'a pas pu être détruit – st78

+0

@recursive: LOL !! –

Répondre

8

Mieux encore, comment utiliser GC.Collect? Pas besoin de synthétiser une condition quand il y a une fonction explicite disponible ...

Notez également la méthode GC.WaitForPendingFinalizers que Adam Butler (commentaire ci-dessus), ChristopheD (answer below) et Michael Petrotta (commentaire ci-dessous) souligné, ce qui prend la prochaine étape. Citation effrayante de la documentation sur cette méthode, cependant: "Le thread sur lequel les finaliseurs sont exécutés n'est pas spécifié, donc il n'y a aucune garantie que cette méthode se termine."shudder

+1

J .: Comme réponse la mieux votée, puisque l'OP semble exiger un synchrone GC, pensez à ajouter 'GC.WaitForPendingFinalizers()' à votre réponse. –

+0

@Michael: Oui, grand moment. –

0

Y a-t-il une raison pour laquelle GC.Collect() ne fonctionne pas pour vous? Cela force la collecte des ordures à se produire.

0

Pourquoi ne pas simplement utiliser GC.Collect pour forcer un garbage collection à la place?

1

Comme cela, par exemple:

int cnt = GC.CollectionCount(0); 
while (GC.CollectionCount(0) == cnt) { 
    string s = new String('*', 1000); 
} 

Cependant, cette volonté bien sûr que courir jusqu'à ce qu'une garbage collection se produit, mais il pourrait ne pas être beacuse des objets qui sont créés, il pourrait être pour une raison quelconque .

Si vous voulez simplement que la récupération de place soit effectuée, la méthode GC.Collect le ferait.

Cependant, il y a rarement une raison de forcer un garbage collection. Les collections se produiront en cas de besoin, vous ne dégraderez généralement les performances qu'en forçant les collections.

+0

Est-ce que 'new String ('*', 1000)' ne retournera pas la même instance à chaque fois? – Elisha

+0

Suis-je le seul à avoir doublé la lecture du nom de variable 'cnt'? – Samuel

+0

@Elisha: Non, les chaînes ne sont pas internées à moins que vous ne les interceptions spécifiquement. – Guffa

-2

Vous ne pouvez pas vous appeler juste GC.Collect()

http://msdn.microsoft.com/en-us/library/system.gc.collect.aspx

+0

Eh bien, vous avez dupliqué ** trois ** réponses précédentes sans rien ajouter, pourrait avoir quelque chose à voir avec cela. Parfois, la duplication se produit, mais quand vous êtes le quatrième (troisième, voire deuxième dans mon livre, mais je suis juste une personne), vous devriez probablement considérer ce lien "supprimer". –

4

Outre l'utilisation GC.Collect: si vous avez vraiment besoin de la collecte des ordures pour être « fini 'synchrone (bloquant en d'autres termes), vous pouvez utiliser GC.WaitForPendingFinalizers: http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx

Notez que Cela peut très bien geler inutilement votre application temporairement.

Le lien fournit également du code qui pourrait déclencher le garbage collector.

+0

+ 1 Citation effrayante, cependant: * "Le fil sur lequel les finaliseurs sont exécutés n'est pas spécifié, donc il n'y a aucune garantie que cette méthode se termine." * Je ne suis pas sûr de pouvoir appeler une méthode * documentée * comme possible jamais revenir... :-) –