Puisque toutes les nouvelles allocations (autres que pour les objets volumineux) vont toujours aller dans Gen0, le GC est conçu pour toujours collecter à partir de la génération spécifiée et ci-dessous. Lorsque vous appelez GC.Collect(2)
, vous demandez au GC de collecter à partir de Gen0, Gen1 et Gen2. Si vous êtes certain que vous avez affaire à beaucoup d'objets volumineux (les objets qui, au moment de l'allocation, sont assez grands pour être placés sur le LOH), la meilleure option est de les mettre à null (Nothing in VB) quand vous en avez fini avec eux. L'allocation LOH tente d'être intelligente et de réutiliser les blocs. Par exemple, si vous avez alloué un objet de 1 Mo sur le LOH, puis que vous l'avez éliminé et que vous l'avez défini sur null, il vous restera un "trou" de 1 Mo. La prochaine fois que vous attribuez quelque chose sur le LOH qui est 1MB ou plus petit, il remplira ce trou (et continue de le remplir jusqu'à ce que la prochaine allocation est trop grande pour tenir dans l'espace restant, à quel point il sera allouer un nouveau bloc.)
Gardez à l'esprit que les générations dans .NET ne sont pas des choses physiques, mais sont des séparations logiques pour aider à augmenter les performances du GC. Puisque toutes les nouvelles allocations vont dans Gen0, c'est toujours la première génération à être collectée. Chaque cycle de collecte qui s'exécute, tout ce qui dans une génération inférieure survit à la collecte est «promu» à la prochaine génération la plus élevée (jusqu'à atteindre Gen2).
Dans la plupart des cas, le GC n'a pas besoin d'aller au-delà de la collecte de Gen0.L'implémentation actuelle du GC est capable de collecter Gen0 et Gen1 en même temps, mais il ne peut pas collecter Gen2 tant que Gen0 ou Gen1 sont en cours de collecte. (.NET 4.0 détend beaucoup cette contrainte et pour la plupart, le GC peut collecter Gen2 tandis que Gen0 ou Gen1 sont également collectés.)
Pourquoi voudriez-vous faire cela, c'est-à-dire PAS collecter de gen 0 ou 1? Le GC .NET fonctionne mieux lorsqu'il est laissé à ses propres appareils. – thecoop
J'en suis conscient. Fondamentalement, vous ne voulez JAMAIS forcer manuellement un GC, car ce sont des opérations intensives. Puisque c'est le cas, quand je vois la nécessité d'exécuter un GC, je voudrais qu'il fonctionne uniquement contre la génération spécifique, plutôt que de faire un GC complet. J'essaie d'être plus précis sur mon utilisation du GC, et il ne me laisse pas faire. – DevinB