Bonjour,
J'ai de la peine à comprendre ou plutôt à accepter comment se gère la mémoire des programmes dotnet.
Soit le code suivant :
Le fichier chargé est un fichier de 5 Mo.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 List<string>() list = new List<string>(); private void button3_Click(object sender, EventArgs e) { string s; using (StreamReader sr = new StreamReader("C:\\temp\\texte.txt")) { s = sr.ReadToEnd(); for (int i = 0; i < 1000000; i++) { list.Add(s); } sr.Close(); } } private void button4_Click(object sender, EventArgs e) { list.Clear(); list.Add(""); //GC.Collect(); }
Avec le code du bouton 3 je charge la mémoire.
Avec le code du bouton 4 je vide ma liste donc théoriquement la mémoire.
Dans le task manager, la quantité de mémoire utilisée ne diminue pas, une fois la liste vidée, si je ne fais pas le Collect du GC.
Et quand je le fais, parfois la mémoire utilisée retombe à sa valeur initiale, parfois ne redescend que très peu.
Si je lance plusieurs fois mon soft et que je charge au max la mémoire puis que je vide ma liste, une fois toute la mémoire de mon ordi utilisée, petit-à-petit, de la mémoire se libère sur les différents process du même soft.
Quand ma mémoire est utilisée à 90% environ mon ordi rame tout de même.
Et pourtant il ne s'agit pas de mémoire utilisée mais de mémoire disponible dans le GC.
De plus, pour contrôler le bon fonctionnement d'un soft, il est donc impossible de savoir quelle somme de mémoire il utilise réellement.
Et certains clients gueulent que mes softs sont trop gourmands......
D'où la question :
Quelle est la bonne pratique afin d'avoir dans le task manager, la somme de mémoire réellement utilisée par un soft dotnet ?
Partager