Comment analyser les <unclassified> utilisation de la mémoire dans windbg

C'est une .NET v4 service windows de l'application en cours d'exécution sur une machine x64. À un certain point, après des jours de course régulièrement le service windows consommation de mémoire des pointes comme un fou jusqu'à ce qu'il se bloque. J'ai pu l'attraper, à 1,2 GO et de capturer un vidage de la mémoire. Voici ce que j'obtiens

Si j'exécute !adresse -résumé dans windbg sur mon fichier de vidage-je obtenir le suivre résultat

!adresse -résumé

--- Usage Summary ------ RgnCount ------- Total Size -------- %ofBusy  %ofTotal
Free                     821      7ff`7e834000 (   7.998 Tb)           99.98%
<unclassified>           3696       0`6eece000 (   1.733 Gb)  85.67%   0.02%
Image                    1851       0`0ea6f000 ( 234.434 Mb)  11.32%   0.00%
Stack                    1881       0`03968000 (  57.406 Mb)  2.77%    0.00%
TEB                      628        0`004e8000 (   4.906 Mb)  0.24%    0.00%
NlsTables                1          0`00023000 ( 140.000 kb)  0.01%    0.00%
ActivationContextData    3          0`00006000 (  24.000 kb)  0.00%    0.00%
CsrSharedMemory          1          0`00005000 (  20.000 kb)  0.00%    0.00%
PEB                      1          0`00001000 (   4.000 kb)  0.00%    0.00%
-
-
-
--- Type Summary (for busy) -- RgnCount ----- Total Size ----- %ofBusy %ofTotal
MEM_PRIVATE                        5837 0`7115a000 (  1.767 Gb)  87.34%  0.02%
MEM_IMAGE                          2185 0`0f131000 (241.191 Mb)  11.64%  0.00%
MEM_MAPPED                           40 0`01531000 ( 21.191 Mb)   1.02%  0.00%
-
-
--- State Summary ------------ RgnCount ------ Total Size ---- %ofBusy %ofTotal
MEM_FREE                            821 7ff`7e834000 (  7.998 Tb)        99.98%
MEM_COMMIT                         6127   0`4fd5e000 (  1.247 Gb) 61.66%  0.02%
MEM_RESERVE                        1935   0`31a5e000 (794.367 Mb) 38.34%  0.01%
-
-
--Protect Summary(for commit)- RgnCount ------ Total Size --- %ofBusy %ofTotal
PAGE_READWRITE                     3412 0`3e862000 (1000.383 Mb) 48.29%   0.01%
PAGE_EXECUTE_READ                   220 0`0b12f000 ( 177.184 Mb)  8.55%   0.00%
PAGE_READONLY                       646 0`02fd0000 (  47.813 Mb)  2.31%   0.00%
PAGE_WRITECOPY                      410 0`01781000 (  23.504 Mb)  1.13%   0.00%
PAGE_READWRITE|PAGE_GUARD          1224 0`012f2000 (  18.945 Mb)  0.91%   0.00%
PAGE_EXECUTE_READWRITE              144 0`007b9000 (   7.723 Mb)  0.37%   0.00%
PAGE_EXECUTE_WRITECOPY               70 0`001cd000 (   1.801 Mb)  0.09%   0.00%
PAGE_EXECUTE                          1 0`00004000 (  16.000 kb)  0.00%   0.00%
-
-
--- Largest Region by Usage ----Base Address -------- Region Size ----------
Free                            0`8fff0000        7fe`59050000 (   7.994 Tb)
<unclassified>                  0`80d92000        0`0f25e000 ( 242.367 Mb)
Image                           fe`f6255000       0`0125a000 (  18.352 Mb)
Stack                           0`014d0000        0`000fc000 (1008.000 kb)
TEB                             0`7ffde000        0`00002000 (   8.000 kb)
NlsTables                       7ff`fffb0000      0`00023000 ( 140.000 kb)
ActivationContextData           0`00030000        0`00004000 (  16.000 kb)
CsrSharedMemory                 0`7efe0000        0`00005000 (  20.000 kb)
PEB                             7ff`fffdd000      0`00001000 (   4.000 kb)

D'abord, pourquoi serait-non classifié montrer de temps que 1.73 GO et l'autre fois comme 242 MO. (Ce qui a été répondu. Merci à vous)

Deuxième, je comprends que non classifié peut signifier le code managé, toutefois ma taille de segment de mémoire selon la !eeheap est seulement 248 MO, ce qui correspond en fait à l'242 mais même pas proche de la 1.73 GO. Le vidage de la taille du fichier est de 1,2 GO qui est beaucoup plus élevé que la normale. Où dois-je aller d'ici, pour savoir ce qui est à l'aide de la mémoire. Rien dans le tas managé monde est sous 248 MO, mais je suis à l'aide de 1,2 GO.

Grâce

MODIFIER

Si je le fais !tas -s j'ai le

LFH Key                   : 0x000000171fab7f20
Termination on corruption : ENABLED
          Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                            (k)     (k)    (k)     (k) length      blocks cont. heap 
-------------------------------------------------------------------------------------
Virtual block: 00000000017e0000 - 00000000017e0000 (size 0000000000000000)
Virtual block: 0000000045bd0000 - 0000000045bd0000 (size 0000000000000000)
Virtual block: 000000006fff0000 - 000000006fff0000 (size 0000000000000000)
0000000000060000 00000002  113024 102028 113024  27343  1542    11    3    1c LFH
    External fragmentation  26 % (1542 free blocks)
0000000000010000 00008000      64      4     64      1     1     1    0    0      
0000000000480000 00001002    3136   1380   3136     20     8     3    0    0  LFH
0000000000640000 00041002     512      8    512      3     1     1    0    0      
0000000000800000 00001002    3136   1412   3136     15     7     3    0    0  LFH
00000000009d0000 00001002    3136   1380   3136     19     7     3    0    0  LFH
00000000008a0000 00041002     512     16    512      3     1     1    0    0      
0000000000630000 00001002    7232   3628   7232     18    53     4    0    0  LFH
0000000000da0000 00041002    1536    856   1536      1     1     2    0    0  LFH
0000000000ef0000 00041002    1536    944   1536      4    12     2    0    0  LFH
00000000034b0000 00001002    1536   1452   1536      6    17     2    0    0  LFH
00000000019c0000 00001002    3136   1396   3136     16     6     3    0    0  LFH
0000000003be0000 00001002    1536   1072   1536      5     7     2    0    3  LFH
0000000003dc0000 00011002     512    220    512    100    60     1    0    2      
0000000002520000 00001002     512      8    512      3     2     1    0    0      
0000000003b60000 00001002  339712 168996 339712 151494   976   116    0   18  LFH
    External fragmentation  89 % (976 free blocks)
    Virtual address fragmentation  50 % (116 uncommited ranges)
0000000003f20000 00001002      64      8     64      3     1     1    0      0      
0000000003d90000 00001002      64      8     64      3     1     1    0      0      
0000000003ee0000 00001002      64     16     64     11     1     1    0      0      
-------------------------------------------------------------------------------------
  • Utiliser le SOS dll et regarder le tas de cette façon. Depuis cette est une .net programme le tas allocations faites par le .net framework n'apparaissent pas dans le segment non géré.
  • ma taille de segment de mémoire selon la !eeheap (sos.dll) est seulement 248 MO. Donc je ne suis pas sûr que ce soit la cause de l'1.2 GO processus de taille, ni la cause de la 1.7 GO dans non classifié, à moins que je me manque quelque chose
  • Que fait votre service? Est-ce que votre service contiennent ou non du C++/CLI code? Il ressemble à un non géré fuite de mémoire. Quel est le GDI, les Objets Utilisateur, nombre de Handles dire? Dans l'appel des piles sont à votre threads bloqués? ~*e!ClrStack et ~*e!DumpStack et ~*ekv sont vos amis pour voir ce que votre fils étaient en train de faire. Est un thread dans le milieu de l'allocation de quelque chose?
  • merci pour votre réponse. Il n'y a pas de direct non géré les appels. Il est difficile de comprendre les choses de l'threads côté des choses, parce que j'ai tellement nombreuses (environ 600). Aucun allouer de grandes quantités de mémoire. Un grand nombre de réseau choses (WMI, etc) qui est prévu. Je ne suis pas sûr de savoir comment requête pour GDI ou à des Objets Utilisateur ou ce que les chiffres pour ceux qui sont bon/mauvais
  • 600 Fils? Le CLR ne utiliser 1 MO d'espace de Pile par défaut, ce qui est commis par défaut. Dans ce cas, vous utilisez déjà plus de 600 MO de mémoire uniquement pour les piles de threads. Mais votre vidage de la mémoire ne montre 57.406 qui serait d'environ 58 threads. Votre plus grande pile de thread était exactement 1 MO, ce qui pourrait indiquer une Stackoverflow. WMI utilise COM comme un fou. Je pourrait très bien être que vous effectuez une requête WMI très souvent avec une certaine forme de "0,1", qui permettra de produire de grandes quantités de déchets à des objets COM.
  • dit que j'ai 605 nombre de threads et de 599 backround fils et 5 dead threads. Vous dites que depuis la taille de la pile est seulement 57MB et mon plus gros tapis est de 1 MO, ce qui prouve que c'est un débordement de pile en quelque sorte? Ce serait TRÈS TRÈS utile à savoir!
  • Au moins un thread est au bord de l'Stackoverflow en raison de sa privée de 1 MO de mémoire de la pile de l'espace. S'il y a déjà un Stackoverflow exception je ne peux pas dire. L' !fils de commande affiche la dernière levée d'une exception pour chaque thread. Mais si vous avez le code non managé cours d'exécution ainsi il pourrait également être un problème. Avec le code managé, vous ne verrez pas StackoverflowException depuis le CLR résilier votre processus immédiatement, sauf si vous l'hôte de la CLR par vous-même et choisir une autre stratégie d'escalade.
  • est-il de toute façon je peux trouver de la taille de la pile de chaque thread? Une fois que j'ai le fil, je peux peut-être voir ce que c'est?
  • Avez-vous déjà couru !analyze-v (avant que ne un .symfix et .recharger) à la charge de la MS des symboles. Cela permettra de trouver un déjà arrivé StackOverflow.
  • j'ai fait et je ne vois pas une exception de dépassement de pile

InformationsquelleAutor Mark | 2012-01-26