2010-09-20 5 views
1

J'ai créé l'application WCF qui s'exécute sur le service Windows. Il a été installé en utilisant Windows Installer. J'ai suivi la procédure mentionnée dans l'article suivant pour le même.Le service Windows WCF ne libère pas les ressources/la mémoire après chaque appel

http://msdn.microsoft.com/en-us/library/bb332338.aspx#msdnwcfhc_topic4

La plupart des propriétés WCF sont conservés par défaut pour le protocole net.tcp, par exemple d'appel et ainsi de suite.

La consommation de mémoire du service ne cesse d'augmenter après chaque appel et ne diminue pas. À la fin, il jette OutOfMemory consommation. L'application renvoie des données basées sur des chaînes très lourdes. Avec memory-profiler j'ai trouvé que la mémoire est toujours allouée aux objets string et augmente pendant l'appel. Selon ma compréhension de la chaîne, les objets gérés devraient libérer les données une fois hors de portée. Informez-moi si d'autres informations de configuration/codage sont nécessaires en particulier.

+0

Les chaînes, comme toute autre chose, ne seront libérées que lorsqu'aucune référence n'y est faite. Si vous voyez que les chaînes ne sont pas libérées, c'est un symptôme, pas le problème. Déterminez quel objet serait maintenu sur une instance de cette chaîne, puis déterminez qui détient toujours une référence à cet objet. Ou ignorez les chaînes dans votre profileur, et regardez lesquelles de vos * classes * fuient. –

+0

J'ai vérifié mon code dans perf mon pour les grands objets LOH msdn.microsoft.com/en-us/magazine/cc534993.aspx et constaté qu'ils sont présents. Recherche net je ne pouvais pas trouver un moyen approprié pour gérer le comportement LOH. – BigBoss

Répondre

0

tentatives infructueuses pour gérer LOH (http://msdn.microsoft.com/en-us/magazine/cc534993.aspx) qui était très grande chaîne dans mon contexte, j'ai créé une classe personnalisée pour le gérer. Au lieu de stocker une grande chaîne dans un seul objet, je la stocke comme une collection de petites chaînes dans un objet personnalisé. .NET l'a éliminé correctement sans créer le problème mentionné ci-dessus.

Une autre solution possible avec travaillé pour moi est d'utiliser l'objet fichier pour stocker un gros fichier et y accéder en tant que lecteur de texte. Cela fonctionne bien et garde l'empreinte de l'application petite. Malheureusement pour moi, cela n'a pas fonctionné et l'accès à l'emplacement du fichier n'était pas autorisé pour l'application.

0

Il doit y avoir quelque chose qui conserve des références à ces chaînes dans le code. Pouvez-vous utiliser votre profileur pour tracer les références qui maintiennent les objets string en vie?

+0

En utilisant le pro-filer de la mémoire, j'ai trouvé que de nombreux objets sont toujours en mémoire et ne sont pas libérés. Même l'objet de chaîne n'est pas libéré, bien que je pense qu'il pourrait être lié à http://msdn.microsoft.com/en-us/magazine/cc534993.aspx ceci. J'arrive à la conclusion que j'ai besoin de redémarrer le service s'il atteint certaines limites de mémoire. – BigBoss

+0

Pouvez-vous publier quels types d'objets ne sont pas libérés? Y a-t-il des objets jetables que vous ne disposez pas probablement? – Kangkan

+0

Veuillez vérifier le commentaire nouvellement ajouté. – BigBoss

0

Il serait très difficile de répondre à cette question sans un code à regarder. Vous pouvez toujours appeler GC.Collect (GC.MaxGeneration) pour forcer la récupération de place et voir si cela ne réduit pas votre consommation de mémoire. Idéalement, ce ne serait que du code temporaire pour suivre ce qui se passe dans l'application. Si forcer le garbage collection ne réduit pas la consommation de mémoire, alors les références aux chaînes doivent être conservées, via des variables membres statiques ou quoi que ce soit: n'ayant aucune idée de ce qu'est le code, toute théorie serait un coup dans l'obscurité

+0

J'ai essayé GC.Collect() et d'autres méthodes de ramasse-miettes mais ça n'a pas abouti. Apparemment, j'ai trouvé qu'il est lié à de gros objets LOH http://msdn.microsoft.com/en-us/magazine/cc534993.aspx, qui ne sont pas éliminés correctement. – BigBoss

+0

veuillez vérifier le commentaire nouvellement ajouté. – BigBoss

Questions connexes