12
votes

Est-il possible d'arrêter la collection de poubelles?

est-il possible pour un programmeur de démarrer / arrêter de manière programmable la collection de déchets en langage de programmation C #? Par exemple, pour l'optimisation de la performance, etc.


3 commentaires

La collecte des ordures ne fait pas partie du langage de programmation C #. Cela fait partie de la .NET CLR.


"En quelque sorte." Si vous n'avez jamais rien allouer, le GC ne collectionnera jamais. Pré-allouer tout ce dont vous avez besoin puis appelle gc.collect () .


Peut-être considérer également cette réponse: Stackoverflow.com/Questtions/6005865/...


4 Réponses :


4
votes

Non, il n'y a pas. Au mieux, vous pouvez déclencher vous-même une collection de déchets vous-même, bien que cela soit considéré comme une très mauvaise chose puisqu'il peut interférer avec les algorithmes de planification intégrés utilisés par le GC.


1 commentaires

Vous ne pouvez pas déclencher la collecte, vous pouvez simplement «suggérer». GC décidera en soi



7
votes

Pas vraiment. Vous pouvez donner le GC Conseils via des méthodes telles que GC.ADDMEMORYPRESURE ou GC.REMOVEMEMORYPRESURE mais ne pas l'arrêter de rien.

En outre, la collecte des ordures n'est pas aussi intense d'un processus. Les programmeurs s'inquiètent très rarement.


5 commentaires

Oh, je vois ... Que diriez-vous de la méthode SuppressFinalize ()? A-t-il un but différent?


SupprimerFinalize fonctionne sur des objets individuels. Certainement pas sur l'ensemble du GC. De MSDN: Les objets qui implémentent l'interface Idisposable peuvent appeler cette méthode à partir de la méthode Idisposable.Dispose pour empêcher le collecteur des ordures d'appeler objet.Finalize sur un objet qui ne le nécessite pas. (Donc, fondamentalement, c'est une très légère amélioration de la performance.)


Je ne vois pas comment cela ajouterait une allusion à prévenir la collecte des ordures, en soi; Si vous appelez gc.addmemoryPressure , cela entraînera probablement le résultat probable dans la fabrication de CLR plus les collections de déchets, car il indique que la mémoire disponible sur le CLR pour le processus (virtuel ou sinon) est inférieur à ce qu'il pense. Un peut appeler gc.removememororyPressure sans appel correspondant à gc.addmemororyPressure , dans une tentative d'asperger le CLR dans la pensée de la pensée que Cela fait, mais on pourrait penser que l'API est résistante (on espère) à de telles choses.


@Casperone: Vous avez raison sur AddMemoryPressure. Je l'ai utilisé dans la réponse en tant que point de comparaison / contraste avec la saisie de remous. Le titre de la question ne fait référence qu'à arrêter de GC, mais la question se réfère à la fois à la fois de démarrage et d'arrêt, donc j'ai mentionné les deux. Bien que ni l'un ni l'autre ne commence ou n'arrête rien. Ils sont juste des allions.


En attendant, il est possible, voir ici



6
votes

En général, non. Et la plupart des gens considèrent que l'optimisation prématurée de l'optimisation prématurée de la collecte des ordures sauf si vous faites du profilage et de découvrir que c'est vraiment la cause de mauvaises performances dans votre application.

Si vous êtes intéressé par le Nitty Gritty de modifier le GC pour la performance (ou plus probablement, modifiez votre application pour améliorer ses performances par rapport au GC), MSDN a une description assez décente des façons de le faire.


0 commentaires

9
votes

Depuis .NET 4.6 C'est possible, il existe des méthodes dans GC Classe :

gc.chstartnogcregion (...) et gc.endnogcregion () .


0 commentaires