2010-04-24 4 views
2

Je sais qu'il n'est pas possible de savoir quand un GC se produit, mais il y a des facteurs qui vous diront à quelle fréquence/quand il peut se produire. Quels sont ces facteurs? On est combien d'objets sont créés, etc.Qu'est ce qui influence le timing d'un GC?

+0

Je ne connais pas la réponse à votre question, mais je voulais simplement souligner qu'il existe plusieurs implémentations de GC. Je connais environ trois: poste de travail, serveur et compact. Aussi, si vous allez exotique, le projet Singularity a quelque chose comme cinq d'entre eux. –

+0

Et bien sûr, il y a Mono, Portable.NET, .NET Compact Framework, Rotor ... –

Répondre

4

La réponse courte est que les événements suivants déclenchent un cycle de collecte:

Allocation dépasse le seuil Gen0

Collection pour une génération spécifique se produit lorsque le seuil de mémoire pour cette génération est atteint. Dans l'implémentation de .NET version 1.0, les seuils initiaux pour les générations 0, 1 et 2 sont 256 kilo-octets (Ko), 2 mégaoctets (Mo) et 10 Mo, respectivement. Notez que le GC peut ajuster ces seuils de façon dynamique en fonction des modèles d'allocation d'une application. Les objets supérieurs à 85 Ko sont automatiquement placés dans le tas d'objets volumineux.

System.GC.Collect() est appelé

Les allocations ne se produisent que dans Gen0. Après chaque GC, Gen0 est vide. Les nouvelles allocations rempliront Gen0 et le prochain GC aura lieu, et ainsi de suite. Le problème avec l'appel manuel de GC.Collect(), c'est que vous pouvez être appelé plus souvent que prévu (parce que le CLR l'appelle également) et que les performances diminuent parce que vous déclenchez des cycles GC avant leur calendrier. .

système est dans une situation de mémoire

Ceci est affecté par d'autres processus du système qui signifie que vous avez vraiment aucun contrôle sur elle autre que d'assurer que vous nettoyer correctement les ressources dans vos processus et composants.

+0

Ce sont les facteurs que j'ai vu sur un autre site et j'ai oublié. Merci. – dotnetdev

1

Collecte des ordures ménagères se produit lorsque l'une des conditions suivantes est remplie:

Le système a une faible mémoire physique.

La mémoire utilisée par les objets alloués sur le tas géré dépasse un seuil acceptable. Cela signifie qu'un seuil d'utilisation de mémoire acceptable a été dépassé sur le tas géré. Ce seuil est continuellement ajusté au cours du processus.

La méthode GC.Collect est appelée. Dans la plupart des cas, vous n'avez pas besoin d'appeler cette méthode, car le garbage collector s'exécute en continu. Cette méthode est principalement utilisée pour des situations et des tests uniques.

0

Pour la version de bureau de C# il y a quelques facteurs:

  • Montant de l'allocation de mémoire (Chaque fois que 1 Mo est alloué un niveau de GC 1 est déclenché)
  • pression de la mémoire du système (si le montant de mémoire physique est faible, GC peut être déclenchée)
  • mémoire virtuelle engage (si le système veut de s'engager pages de mémoire, puis un GC peut être déclenchée avant l'opération)
  • Programmatic déclenchement du code.
  • D'autres heuristiques peuvent être utilisées par GC pour déclencher des collectes.

Dans le cas où vous êtes intéressé lorsque des collections de niveau 3 sont sur le point de se produire dans .Net framework 3.0 et au-dessus il y a des notifications GC que vous pouvez vous abonner, être averti avant qu'ils ne surviennent: RegisterForFullGCNotification

+0

Je crois que vous ne pouvez utiliser 'RegistorForFullGCNotification' que si vous utilisez Server GC et non Workstation GC, qui est la valeur par défaut pour les applications de bureau. –

+0

@Scott Dorman, vous pouvez vous inscrire pour tout type de GC utilisé. –

+0

Désolé ... vérifiez cette page pour plus de détails: http://msdn.microsoft.com/en-us/library/cc713687.aspx 'Cette fonctionnalité est disponible uniquement lorsque la récupération de place simultanée est désactivée. Par défaut, la récupération de place simultanée est activée sauf si vous exécutez dans un environnement hébergé et que l'hôte a modifié la configuration pour vous. » –