IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Mémoire qui explose ou blocage du garbage collector


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut Mémoire qui explose ou blocage du garbage collector
    Bonjour,
    Je suis sur un projet où j'ai un problème avec la mémoire qui gonfle jusqu'à la saturer.
    Du coup, j'ai fait un timer qui va forcer le garbage collector à faire son travail avec le code suivant :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Logger.Fatal("GC 1");
    GC.Collect();
    Logger.Fatal("GC 2");
    GC.WaitForPendingFinalizers();
    Logger.Fatal("GC 3");
    GC.WaitForFullGCComplete();
    Logger.Fatal("GC 4");
    GC.Collect();
    Logger.Fatal("GC 5")

    Ce code est dans une DLL sur laquelle je m'appuie avec un projet Test, un exe console, et un projet Service, pour monter le programme en service windows.

    Sur le PC de développement (Win 11), ce code fonctionne à merveille, que je sois en console ou en service.
    Cette semaine, je viens de monter le projet sur un serveur Win 2019 pour le mettre sur la machine de production.
    Lorsque je lance le projet en mode console, tout va bien
    Par contre, lorsqu'il est en service, je n'ai dans mes log que GC1 et GC2 et le thread reste coincé sur WaitForPendingFinalizers pas de GC 3/4/5 ?

    Ma question est la suivante : Pourquoi ça fonctionne en mode console et service sur Win 11 et que seule la console fonctionne sur Win 2019 ?

    Pour information, j'ai ajouter un log au début et à la fin de tous les destructeurs du projet mais aucun n'est exécuté (normal, ce sont tous des objets IDisposable et lors de l'appel de Dispose(), il y a la ligne GC.SuppressFinalize(this);)

    D'ailleurs pourquoi le GC ne fait pas sont travail initialement aussi ?

    Merci

    P.S. : Le service doit tourner H24 et 7/7

  2. #2
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 671
    Par défaut
    Bonjour,

    Citation Envoyé par ypelissier Voir le message
    D'ailleurs pourquoi le GC ne fait pas sont travail initialement aussi ?
    Je ne sais pas trop pourquoi l'execution est différente selon la machine mais oui il y a peut-être matière a optimiser le tout. Qu'est ce qui rempli la mémoire de base ? Quels types d'opérations ?

    Parce que le Garbage Collector est une machine bien huilée normalement.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut
    Merci PixelJuice,
    Peut-être avec plus de détails de ce que j'ai fait sans rentrer dans le détail complet du code, voici les grandes lignes :
    1 - Je reçois un message que je mets dans une pile et je déclenche 2
    2 - Je vérifie qu'il n'y a pas un autre consommateur de ma pile en cours d'exécution, s'il y en a un, je lui laisse la main et j'ai fini
    3 - Le consommateur va récupérer le premier message de la pile pour le traiter et traiter les autres par la suite
    4 - Le traitement du message est fait par le lancement d'un thread indépendant dont je n'attends pas de retour
    5 - Il y a un contrôle pour ne pas lancer plus de N thread en parallèle
    6 - Une fois le thread terminé, je m'attendais à ce que le Garbage Collector fasse son travail de nettoyer la mémoire à un moment non donné mais il ne le fait pas alors j'ai mis un timer qui s'exécute 1 fois par minute avec le code du GC qui se passe donc très bien avec l'exé standard et le service sur PC ainsi qu'en exé standard sur le serveur mais pas en service.

    Je n'ai aucune idée de la raison de cette différence sachant que je n'ai fait aucun destructeur spécifique.

    P.S. : J'ai oublié de mentionner que je suis sur le framework 4.8.

  4. #4
    Membre éclairé Avatar de Chou-ette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2018
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2018
    Messages : 57
    Par défaut
    Il n'y a pas lieu de forcer le GC à faire son job, dans l'immense majorité des cas (si ce n'est tous) quand il y a un problème, la cause vient du code. Il faudrait voir comment vous gérez les threads ?

    Une explication possible est que vous gérez mal leur fin et qu'il reste des références vers chaque instance. Le GC considérera alors, et à raison, que ces objets ne sont pas collectables.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut
    Merci Chou-ette,
    Les thread sont gérés ainsi
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var thread = new Thread(new ThreadStart(MaMethode));
    thread.Start();
    Et comme indiqué, une fois le thread lancé, je ne m'en occupe plus et je passe au message suivant.
    Il ne retourne rien et je n'ai pas besoin d'attendre un quelconque retour.
    Donc quand la méthode est terminée, je ne m'en occupe plus depuis longtemps et je ne fais rien de particulier du coup, pensant que le GC s'en occuperai...

    C'est peut-être là qu'est effectivement le problème et si vous avez des pistes pour mieux gérer cela, je suis toutes ouïes ouvertes.

    Merci pour votre aide.

Discussions similaires

  1. [JVM]Garbage collector
    Par godik dans le forum Général Java
    Réponses: 5
    Dernier message: 07/10/2005, 10h12
  2. JPanel et Garbage Collector
    Par tck-lt dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 25/07/2005, 19h03
  3. HELP!!Base de Données tempdb qui explose!!
    Par mohamed dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 15/07/2005, 14h32
  4. [JVM] les objets et le Garbage collector
    Par Kurdran dans le forum Général Java
    Réponses: 7
    Dernier message: 02/06/2005, 17h57
  5. [Language]Garbage collector
    Par GETah dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2005, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo