OVH Cloud OVH Cloud

Fuite mémoire ou GC ?

6 réponses
Avatar
Delf
Bonjour.

J'ai mis un morceau de code dans un boucle infinie while()

while(true)
{
[...]

System.Threading.Thread.Sleep(500);
}

Dans le gestionnaire des tâches, l'utilisation mémoire monte pendant qq
secondes de 3/5mo. puis se stabilise plusieurs secondes, remonte, se
stabilise, remonte et se stabilise finalement...

Est-ce du à une fuite mémoire ou au GC ?
Merci.

--
Delf

6 réponses

Avatar
adebaene
Delf a écrit :
Bonjour.

J'ai mis un morceau de code dans un boucle infinie while()

while(true)
{
[...]

System.Threading.Thread.Sleep(500);
}

Dans le gestionnaire des tâches, l'utilisation mémoire monte pendant qq
secondes de 3/5mo.


Le gestionnaire des taches est pour ainsi dire inutilsiable pour une
analyse sérieuse de la consommation mémoire d'une application, oublie
le (ce qu'il affiche dépend du working set, donc de la consommation
mémoire globale sur ta machine, pas que de ton application).

Utilises perfmon et regardes le compteur "Private bytes" pour ton
processus, ainsi que tous les compteurs dans la catégorie "CLR memory"
pour ton processus : ca te donnera une image fiable de la consommation
mémoire de ton application.

Arnaud
MVP - VC
Avatar
Guillaume Davion
Et sinon, pour la question de la fuite mémoire, tout dépends de ce
que tu fais dans ta boucle.

Si tu gardes des références sur tous les objets instanciés, ou bien
si tu ne fais pas appel à la méthode Dispose() pour ceux qui en ont
besoin, ca peut être la cause de fuites.

L'autre idée à suivre et celui d'un fonctionnement "normal" du GC,
car en fait le Garbage Collector ne libére les ressources que quand il
estime que c'est nécessaire et qu'il a le temps. Du coup, si au bout
d'un moment la mémoire se libére malgrès tout, c'est que le GC s'est
décidé à faire le ménage.
Avatar
Delf
Guillaume Davion wrote:

Et sinon, pour la question de la fuite mémoire, tout dépends de ce
que tu fais dans ta boucle.



Je fais des appels à 5 Web services. J'invoque bien la méthode Dispose()
sur mes objets proxy. Donc, j'ai regardé ce que faisaient les Web services.

L'un d'entre eux réinitialise une assembly dynamique via une librairie.
Faut-il détruire l'assembly (qui est créée dynamiquement) avant de la
"redéfinir" ? Si oui, comment ? Point de Dispose()...

L'autre charge la confguration va la BDR, il ferme bien la clé en fin de
traitement :

if (Key != null)
{
Key.Close();
Key = null;
}

Si tu gardes des références sur tous les objets instanciés, ou bien
si tu ne fais pas appel à la méthode Dispose()



Tout est initialisé dans la boucle (pour les tests).

pour ceux qui en ont
besoin, ca peut être la cause de fuites.



Oui, il va falloir que je fasse ça.

L'autre idée à suivre et celui d'un fonctionnement "normal" du GC,
car en fait le Garbage Collector ne libére les ressources que quand il
estime que c'est nécessaire et qu'il a le temps.



Je trouve ça assez stressant :
Merci.

--
Delf
Avatar
Delf
wrote:

Le gestionnaire des taches est pour ainsi dire inutilsiable pour une
analyse sérieuse de la consommation mémoire d'une application, oublie
le (ce qu'il affiche dépend du working set, donc de la consommation
mémoire globale sur ta machine, pas que de ton application).



Utilises perfmon et regardes le compteur "Private bytes" pour ton
processus, ainsi que tous les compteurs dans la catégorie "CLR memory"
pour ton processus : ca te donnera une image fiable de la consommation
mémoire de ton application.



Intéressant, je connaissais pas trop - j'en avais entendu parlé au sujet
des ComputerPerformance je crois -

--
Delf
Avatar
Delf
wrote:

Utilises perfmon et regardes le compteur "Private bytes" pour ton
processus, ainsi que tous les compteurs dans la catégorie "CLR memory"
pour ton processus : ca te donnera une image fiable de la consommation
mémoire de ton application.



J'ai regardé côté handle. Ca monte assez vite...

--
Delf
Avatar
adebaene
Delf a écrit :
wrote:

> Utilises perfmon et regardes le compteur "Private bytes" pour ton
> processus, ainsi que tous les compteurs dans la catégorie "CLR memory"
> pour ton processus : ca te donnera une image fiable de la consommation
> mémoire de ton application.

J'ai regardé côté handle. Ca monte assez vite...


Ca, c'est mauvais signe.... Utilises Process Explorer ou handle
(www.sysinternals.com) pour regarder à intervalles réguliers quels
sont les objets sur lesquels ton processus à des handles ouverts...

Arnaud
MVP - VC