est-il judicieux d’utiliser GC.Collect pour une application fonctionnant 24h par jour?

Nous avons une application qui fonctionne 24h par jour et 7 jours par semaine. Parfois, le processeur atteint 100%, puis 80%. La même chose avec la RAM. Est-il judicieux d’appeler manuellement GC.Collect après quelques heures ou mieux pour le quitter automatiquement?

Nous utilisons C # 2010, SQL 2008 et Fluent Nhiberanet. Ceci est une application de bureau.

Je n’appellerais pas cela intelligent d’appeler GC.Collect() “toutes les quelques heures”, ou “quand l’utilisation de la RAM deviendra trop importante”, mais je l’appellerais intelligemment pour l’appeler dès que vous aurez plus d’informations que le GC, quelques exemples

  • Vous savez, ce gros morceau de RAM ou ces nombreux petits objects que vous venez d’allouer ne seront plus utilisés et vous êtes dans un environnement à un seul fil et (bien sûr) vous avez effacé toutes vos références.
  • Vous savez, une “rupture de GC” fera moins mal en ce moment qu’un peu plus tard

Le GC est un code très optimisé et très intelligent, mais il ne peut fonctionner qu’avec les informations dont il dispose.

Téléphoner manuellement à GC.Collect n’est jamais une bonne idée car vous devriez rechercher pourquoi votre application reçoit autant de ressources au lieu de les nettoyer chaque fois que vous êtes sur le point d’atteindre 100%.

Jetez un coup d’oeil au dessous je pense que ça vaut vraiment la peine d’être lu

Chapitre 5 – Amélioration des performances du code géré

normalement, le framework lui-même se chargera d’appeler le GC lorsque cela est nécessaire, vous pouvez essayer de l’exécuter sans appeler vous-même pendant une journée

GC.Collect ne résoudra pas les problèmes par magie si vous avez des références inutiles ou si vous oubliez de vous désabonner des delegates. Le framework récupère les ordures par lui-même de temps en temps, donc je ne crois pas que le fait d’appeler GC.Collect toutes les quelques heures puisse tout changer.

Réponse courte: non.

Le ramasse-miettes n’est pas une zone dans laquelle vous voulez aller, sauf obligation. Normalement, le runtime .net l’appelle à tout moment. Si vous appelez cela vous-même, ce ne seront que des frais généraux supplémentaires.

Je m’abstiendrais d’appeler GC.Collect – cas exceptionnels tels que décrits ici et ici de côté.

Si vous avez une application fonctionnant 24 heures sur 24, 7 jours sur 7, je vous recommanderais ce qui suit:

  • vérifier réellement la présence de memory leaks et y remédier (en utilisant plusieurs profileurs de mémoire)
    SI vous avez besoin de liens, merci de le dire …

  • faites de votre mieux pour réduire l’utilisation des ressources en optimisant / réécrivant votre code

  • configurez l’application pour utiliser le CPG en “mode serveur”, car elle est conçue pour des situations 24 heures sur 24, 7 jours sur 7 (pour plus de détails, voir ici )
    Ce n’est pas une solution miracle, mais vous devriez essayer avec votre application et comparer si cela vous apporte des avantages.