2010-04-22 13 views
5

Dostałem OutOfMemoryException po uruchomieniu aplikacji na 1 dzień, aplikacja całkowicie korzysta z pamięci 1,5G, wszystkie zużyte przez sterowane sterty, gen 2 używane 200mb i LOB używane 1.3mb, jednak zmęczony Rzecz w tym, że 900mb przestrzeni jest bezpłatne. z perfekcyjnego licznika zobaczyłem, że wydarzyło się kilka kolekcji genów 2 gc, dlaczego kolekcjoner GC nie może zebrać 900mb wolnej przestrzeni w gen2 i LOB?Aplikacja x86 .net z system.OutOfMemoryException

Jestem naprawdę wdzięczna za pomoc.

następujących informacji są z WinDbg:

0:000> !eeheap -gc 
Number of GC Heaps: 1 
generation 0 starts at 0x183153f0 
generation 1 starts at 0x182aa834 
generation 2 starts at 0x02131000 
ephemeral segment allocation context: none 
segment  begin allocated size 
02130000 02131000 0312f284 0xffe284(16769668) 
07750000 07751000 0874fc5c 0xffec5c(16772188) 
09e30000 09e31000 0ae2fc2c 0xffec2c(16772140) 
0b230000 0b231000 0c22ffec 0xffefec(16773100) 
0c230000 0c231000 0d22f6f0 0xffe6f0(16770800) 
0d230000 0d231000 0e22ea10 0xffda10(16767504) 
0e230000 0e231000 0f22c1c4 0xffb1c4(16757188) 
10390000 10391000 1138ddf4 0xffcdf4(16764404) 
154e0000 154e1000 164da90c 0xff990c(16750860) 
34aa0000 34aa1000 35a9dbfc 0xffcbfc(16763900) 
7aca0000 7aca1000 7bc9edfc 0xffddfc(16768508) 
49760000 49761000 4a75ef64 0xffdf64(16768868) 
7bca0000 7bca1000 7cc99bac 0xff8bac(16747436) 
17a70000 17a71000 183313fc 0x8c03fc(9176060) 
Large object heap starts at 0x03131000 
segment  begin allocated size 
03130000 03131000 041250c8 0xff40c8(16728264) 
08920000 08921000 099102f8 0xfef2f8(16708344) 
.... 
.... 
4c760000 4c761000 4d71d578 0xfbc578(16500088) 
1bb10000 1bb11000 1ca110d0 0xf000d0(15728848) 
57760000 57761000 5862d7f8 0xecc7f8(15517688) 
Total Size:    Size: 0x5ab13450 (1521562704) bytes. 
------------------------------ 
GC Heap Size:   Size: 0x5ab13450 (1521562704) bytes. 
0:000> !dumpheap -stat 
total 0 objects 
Statistics: 
     MT Count TotalSize Class Name 
73037c78  1   12 System.Configuration.GenericEnumConverter 
73036da0  1   12 System.Configuration.InfiniteIntConverter 
.... 
.... 
69161c3c 35025  6809420 System.Windows.EffectiveValueEntry[] 
69164748  54  12471072 MS.Internal.WeakEventTable+EventKey[] 
710e2228  9540 190389260 System.Byte[] 
710dd2b8 1317031 339257932 System.String 
0035a670  6427 902224056  Free 
Total 3615631 objects 
+1

mam ten błąd dzisiaj. to była nieskończona pętla -__- –

+0

Jaka to aplikacja? Jakiej warstwy komunikacyjnej używasz? WCF? –

Odpowiedz

0

Nie wiem co się dzieje z Gen2 tam, ale uważam, że duży obiekt kupie nigdy ubija - więc może się okazać, że masz 900MB "luk". Tylko zgadnij, naprawdę ...

+0

Tak, zgadzam się z tobą, że jest to spowodowane przez LOH, ponieważ nie jest skompaktowany, w żaden sposób mogę obejść? – Allen

+4

@Allen: Czy istnieje sposób, aby ponownie uruchomić proces co 12 godzin? Nie jest czysty, ale prawdopodobnie będzie mniej pracy niż cokolwiek innego. Z drugiej strony, zbadanie, dlaczego masz tak wiele bardzo dużych obiektów i próbujesz je zredukować, nie byłoby złym pomysłem. –

0

Może warto być profilerem pamięci. SciTech ma fajny, z tutorialami na ich stronie internetowej, jak znaleźć potencjalne problemy. Rzeczy takie jak nieutrzymywanie lub pozostawienie odniesienia za pośrednictwem delegata może spowodować wzrost zużycia pamięci.

0

Zgadzam się, że to luki w LOH.

Po napotkaniu tego problemu odkryłem, że zazwyczaj istnieje jedna lub dwie kolekcje, które są tworzone wielokrotnie.

Jednym z rozwiązań, których używam, jest jednorazowe utworzenie kolekcji i zainicjowanie jej do rozmiaru, który będzie dostosowywał się do rozmiaru, który w końcu się stanie. Powoduje to początkowe zużycie pamięci początkowej, ale zmniejsza wyjątki OutOfMemory.

2

Jeśli zamierzasz używać WinDBG/SOS, naucz się go używać;) Wiele postów Tess Ferrandez na ten temat jest nieocenionym źródłem informacji.

Użyj! Dumpheap -stat do gromadzenia statystyk na temat typów (i liczby) przedmiotów pochłaniających twoje hałdy.

Użyj! Dumpheap -min, aby znaleźć obiekty o wielkości co najmniej bajtów.

Użyj! Dumpheap, aby określić, jakie obiekty aktualnie znajdują się w częściach sterty.

Użyj! Gcroot, aby znaleźć wszelkie korzenie, które utrzymują przedmioty przy życiu, a które Twoim zdaniem były martwe.

Bez niektórych informacji o aplikacji i scenariuszach trudniej jest ją zdiagnozować. Kilka wskazówek:

Sprawdź, czy masz jakieś statyczne pojemniki lub statyczne obiekty, które zawierają wiele rzeczy. Pamiętaj - obiekty statyczne działają przez cały czas użytkowania aplikacji. Dlatego statyczne pojemniki działają przez całe życie aplikacji i jeśli odnoszą się do obiektów, które powinny zostać usunięte, obiekty będą nadal żyć.

Pamiętaj też, że Twoja aplikacja może zużywać ogromne ilości pamięci RAM, ponieważ może być dużo wolnej pamięci RAM, więc nie jest to warte kosztów zbierania i zagęszczania LOH.

ten może również okazać się bardzo cenne: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

Powiązane problemy