2010-02-09 6 views
0

J'ai la situation suivante fuite dans un VB.NET (.NET2) Application: une forme - DetailTache (TaskDetails) - dans mon application MDI est pas de déchets collectés ne sont pas collectées ofter ouvert/Fermer.aide pour trouver une fuite mémoire Cause

j'ai fait la racine de profilage suivant:

alt text http://lh6.ggpht.com/_1TPOP7DzY1E/S3Fg3ifizgI/AAAAAAAADC0/flRMOatEljs/s800/Capture2.png

toute idée comment cette fuite pourrait être fixé? Merci.

EDIT:

recherche Résultat de projet de WinComboRowSelected événement. Il y a 3 usages de ce mot dans l'application:

    Déclaration
  1. en classe WinCombo: Event WinComboRowSelected(ByVal sender... (un seul)
  2. Raising: RaiseEvent WinComboRowSelected(sender, (3 vaissellieres)
  3. Utilisation: ...e As Keolis.ctlWinCombo.WinCombo.WinComboRowSelectedEventArgs) Handles cmbProduit1.WinComboRowSelected (poignées multiples).

aucune autre utilisation de cet événement.

Si besoin d'autres détails de code, s'il vous plaît demander et je l'afficherai.

+2

pouvons-nous voir du code? – dada686

+0

@ dada686: OK, dites-moi ce que vous voulez voir? – serhio

Répondre

5

L'info-bulle qui apparaît dans l'arborescence d'objets me semble significative. Il pilote probablement un gestionnaire d'événements pour l'événement RowSelected afin qu'il puisse mettre à jour l'astuce. Clairement, vous utilisez un contrôle tiers, ça sent Infragistics. Pas une entreprise bien connue pour la qualité de ses produits.Je devinerais en outre que l'info-bulle est interne à son contrôle et que vous ne pouvez pas y accéder pour désinscrire de force le gestionnaire d'événements. Au-delà de l'abandon des conseils sur les outils, si cela est possible, vous ne pouvez pas faire grand chose, mais contactez le fournisseur pour obtenir de l'aide. Ou abandonner le contrôle.

+0

:) comme d'habitude, vous tirez dans le centre droit (désolé pour une traduction si non-anglais). Vous avez raison, l'info-bulle semble être significative, car je vois même penser aux autres ressources non-Disposed à passer de MDIMainForm via cette étrange ToolTip. Nous utilisons des contrôles tiers, l'un d'entre eux étant Infragistics. Plus que cela: 'Public Class WinCombo hérite Infragistics.Win.UltraWinGrid.UltraCombo' – serhio

+1

Hmya, je ne comprends pas pourquoi vous ne divulguez pas ce genre d'informations essentielles. Répartis sur 4 sujets, tous sur le même sujet, vous avez perdu le temps d'environ 15 contributeurs à ce forum. Poser des questions ici semble être une sorte de jeu pour vous. Le terme anglais pour cela est "rep whoring", je ne connais pas le terme français pour cela. Anyhoo, abandonne le contrôle, Infragistics crée des ordures. –

+0

@nobugz: Tout d'abord, merci l'ennemi éclairant le problème. Maintenant, vous n'avez aucune raison pour les critiques. Comment pourrais-je savoir que ** cette ** information était essentielle ?! Ce fut vraiment une "découverte" pour moi qu'un 3ème contrôle pourrait provoquer cette fuite! Deuxièmement, mes autres discussions sur la fuite de mémoire n'étaient pas directement liées à ce problème. par exemple "Comment supprimer les gestionnaires sur un formulaire de base" est une question générale, "les délégués peuvent causer des fuites de mémoire" était un autre problème (déjà résolu) - j'ai eu un délégué non disposé et je n'ai plus, EventHandler et Memory Leaks est aussi un Question générale etc etc – serhio

0

Sans votre code, il est difficile de dire comment réparer la fuite.

Rappelez-vous ce qui ferait un objet non collecté. S'il avait toujours une référence à l'objet.

Je regarderais votre pouvoir et m'assurerais que toutes les références sont définies sur null quand vous vous attendez à ce qu'il soit collecté. Si ce n'est pas collecté, cela signifie que quelque chose a toujours une référence.

Je lirais ceci article pour une meilleure compréhension de la collecte des ordures.

+0

les références de l'EventHandler, comme on peut le voir dans mon cas, ne sont pas si évidentes à détecter ... J'ai ajouté quelques explications dans Edit. – serhio

0

Votre formulaire comporte-t-il des gestionnaires d'événements qui n'ont pas été désinscrits? Ce serait la cause numéro un pour que les contrôles ne soient pas ramassés.

Assurez-vous que les formulaires qui souscrivent à WinComboRowSelectedEvent sont également désinscrits avant d'éliminer le formulaire.

+0

a ajouté quelques explications sur cet événement dans edit – serhio

0

VMMap offre des vues flexibles pour l'analyse de la mémoire des processus vivants:

VMMap est un processus d'analyse de la mémoire virtuelle et physique utilitaire. Il affiche la répartition des types de mémoire virtuelle validée d'un processus ainsi que la quantité de mémoire physique (jeu de travail) affectée par le système d'exploitation à ces types. Outre les représentations graphiques de l'utilisation de la mémoire, VMMap affiche également des informations récapitulatives et une carte mémoire de processus détaillée. Des capacités puissantes de filtrage et d'actualisation vous permettent d'identifier les sources d'utilisation de la mémoire de processus et le coût en mémoire des fonctionnalités de l'application.

+0

C'est un outil pour analyser l'utilisation de la mémoire - vous avez une fuite de mémoire. Relier les points. –

+0

dans mon cas, j'ai utilisé JetBrains dotTrace et aussi .NET Memory Profiler, VMMap peut-il m'en dire plus que j'ai déjà? – serhio

+0

Désolé, serhio. Je ne connais que le lien entre votre question et la réponse de Gimel. –

0

Comme indiqué nobugs (merci encore), le problème résidait vraiment dans les composants tiers utilisés - Infragistics. Comme je le découvre plus tard, l'équipe d'Infragistics a décidé de conserver des références statiques à tous les contrôles ajoutés en mémoire afin de prendre en charge de tels effets (secondaires) comme les changements de thème XP.

vraiment utile sur le problème était this article, la solution proposée dans la sorcière remplacé les objets conservés dans la mémoire avec WeakReferences, qui peuvent être collectées par le GC.

Heureusement, nous avons utilisé une ancienne version d'Infragistics qui fonctionnait dans l'article et la solution. Il est toutefois dommage qu'Infragistics n'ait pas l'intention de corriger ces bugs, même déclarés il y a des années.