2011-09-28 3 views
0

Une application 32 bits .net s'exécutant sur une machine 32 bits s'est exécutée dans une exception OutOfMemoryException. J'ai ensuite pris un vidage de mémoire, et bien que j'utilise WinDbg, je peux vérifier que beaucoup de mémoire est utilisée, je me demande pourquoi nous obtenons des OOMEs, bien que la taille du tas GC, selon la sortie de WinDbg à "! Eeheap -gc", seulement environ 1 Go, il semble donc qu'il reste assez d'espace pour les 1,5 Go de .net.OutOfMemoryException, taille du fichier de vidage et taille du segment de mémoire GC

Voici ce sont des parties de la sortie:

0:000> !eeheap -gc 
Number of GC Heaps: 1 
generation 0 starts at 0x6a12ffcc 
generation 1 starts at 0x6a12ffc0 
generation 2 starts at 0x016a1000 
ephemeral segment allocation context: (0x6a12ffd8, 0x6a12ffe4) 
segment begin allocated  size 
016a0000 016a1000 0269ff64 0x00ffef64(16772964) 
... 

69130000 69131000 6a12ffd8 0x00ffefd8(16773080) 
Large object heap starts at 0x026a1000 
segment begin allocated  size 
026a0000 026a1000 03698a98 0x00ff7a98(16743064) 
... 

70020000 70021000 70a7d750 0x00a5c750(10864464) 
Total Size 0x3c67abb4(1013427124) 
------------------------------ 
GC Heap Size 0x3c67abb4(1013427124) 

Est-ce qu'on doit attendre? Où seraient les ~ 500 Mo restants?

Quelques détails:

  • Le fichier de vidage lui-même a une taille de 2.007.000.476 octets.
  • La machine sur laquelle le logiciel était exécuté ne disposait que de 1 Go de RAM physique, mais la mémoire virtuelle de cette machine était configurée pour atteindre 3 Go (de sorte que l'application devrait pouvoir atteindre le maximum de 32 Go). applications nettes).

Répondre

1

Très probablement, le processus ne prend pas en charge 3 Go. C'est un paramètre par processus.

De plus, si vous voulez voir l'utilisation totale de la mémoire, vous pouvez utiliser! Heap -s. Cela vous donnera un résumé de ce que chaque tas fait et la quantité de mémoire qu'il utilise. Cela vous montrera également les problèmes de fragmentation. Combinez cela avec le tas géré, et cela devrait vous donner une idée de l'utilisation totale de la mémoire.

+0

Le processus devrait pouvoir aller jusqu'à 1.5G, si je ne me trompe pas. Mon problème n'est pas que je veuille changer la limite (comme à 3GB). Btw. d'autres réponses/commentaires sur SO j'ai eu l'impression que ce n'est même pas possible. Je veux savoir où les autres 500 megs ou si sont dans .net tas. J'ai essayé! Heap -s, mais cela n'a totalisé qu'environ 100MB (il faut vérifier plus tard quand j'ai plus de temps, la sortie de cette commande prend un peu de temps pour s'y habituer) –

+0

Vous devez vérifier la taille de la réserve. Cela vous indique essentiellement combien d'espace d'adressage de processus le processus a demandé. Cela étant élevé est ce qui causera des erreurs de MOO. Eh bien, c'est une simplification grossière, mais c'est un bon début, et couvrira 90% des cas. – Zipper

0

Une taille de vidage de près de 2 Go indique que l'espace d'adressage utilisateur du processus est plein. La mémoire est remplie non seulement par des allocations de mémoire .Net, mais aussi par des affectations natives (C/C++), du code jitted, des binaires, des piles, ... Avec Windbg, vérifiez l'utilisation de l'espace virtuel avec! Address -summary. Pour obtenir une vue globale, vous pouvez également utiliser DebugDiag pour analyser la sauvegarde.

+0

! Adresse -summary me dit que 1.917.264 KB/~ 98% Pct (Occupé) sont utilisés par RegionUsageIsVAD. Je ne sais pas comment cela m'aide cependant. –

+0

VAD est de la mémoire allouée via VirtualAlloc non reconnu comme tas win32. Généralement la mémoire .Net et les grands objets du tas Win32 sont marqués comme VAD – plodoc

+0

Avez-vous regardé la sortie de! Eeheap (sans -gc) pour vérifier la mémoire utilisée par le chargeur? – plodoc

Questions connexes