2010-04-22 11 views
5

tengo OutOfMemoryException después de la aplicación en ejecución durante 1 día, la aplicación utilice totalmente la memoria de 1,5 G, todo consumido por montón administrado, Gen 2 utiliza 200mb, y LOB utilizaron 1,3 MB, sin embargo, el weired Lo que es, 900mb de espacio son gratis. desde el contador de rendimiento vi que había una cantidad de generación de 2 gc, ¿por qué el recopilador de GC no puede recoger esos 900mb de espacio libre en gen2 y LOB?x86 con System.OutofMemoryException

Realmente me complace su ayuda.

siguiente información son de 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

tengo ese error hoy. era de un ciclo infinito -__- –

+0

¿Qué tipo de aplicación es esta? ¿Qué tipo de capa de comunicación estás usando? WCF? –

Respuesta

0

no sé lo que está pasando con Gen2 allí, pero creo que el montón de objetos grandes no se compacta - lo que podría ser que tienes 900MB de "lagunas" de manera efectiva. Sólo una suposición, sin embargo, realmente ...

+0

Sí, estoy de acuerdo con usted que es causado por LOH ya que no está compactado, ¿puedo solucionarlo? – Allen

+4

@ Allen: ¿Hay alguna manera de que pueda reiniciar el proceso cada 12 horas? No está limpio, pero es probable que sea menos trabajo que cualquier otra cosa. Por otro lado, investigar por qué tienes tantos objetos muy grandes y tratar de reducir eso no sería una mala idea. –

0

valdría la pena conseguir un perfilador de memoria. SciTech tiene una buena, con tutoriales en su sitio web sobre cómo encontrar problemas potenciales. Cosas como no deshacerse o dejar una referencia a través de un delegado pueden hacer que el uso de la memoria se acumule.

0

Estoy de acuerdo en que son las lagunas en el LOH.

Cuando me he encontrado con este problema, he descubierto que generalmente hay una o dos colecciones que se crean una y otra vez.

Una solución que uso es crear la colección una vez e inicializarla a un tamaño que se adapte al tamaño que se convertirá finalmente. Esto aumenta inicialmente el uso inicial de la memoria, pero reduce las excepciones outOfMemory.

2

Si va a utilizar WinDBG/SOS, aprenda a usarlo;) Las numerosas publicaciones de Tess Ferrandez sobre este tema son un recurso invaluable.

Utilice! Dumpheap -stat para recopilar estadísticas sobre los tipos (y el número) de objetos que consumen sus montones.

uso! -min dumpheap para encontrar los objetos que están al menos bytes de grande.

uso! Dumpheap para identificar qué objetos residen actualmente en partes de su montón.

Usa! Gcroot para ayudar a encontrar las raíces que mantienen vivos los objetos que pensabas que estaban muertos.

Sin algunos detalles sobre su aplicación y sus escenarios, es un poco difícil de diagnosticar más. Algunos consejos:

A ver si tiene alguna contenedores estáticos u objetos estáticos que contienen gran cantidad de cosas. Recuerde: los objetos estáticos viven durante la vida de la aplicación. Los contenedores estáticos, por lo tanto, viven durante la vida útil de la aplicación y, si hacen referencia a objetos que deberían haberse eliminado, los objetos seguirán vivos.

Además, tenga en cuenta que su aplicación puede consumir grandes cantidades de RAM porque puede haber suficiente RAM libre, por lo que no vale la pena el costo de recopilar y compactar el LOH.

Esto también puede resultar muy valiosa: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx