Tenemos algún tipo de fuga, cuya naturaleza no entiendo. Gen0/1/2 montones no aumentan de tamaño, sin embargo, el conjunto de trabajo aumenta hasta que OOM.Finalizer Queue crece pero Managed Heaps no
DebugDiag me dice que CLR.DLL posee la creciente memoria y también me dice que tenemos una creciente cola de finalizador - cientos de miles de objetos Texture2D (es una aplicación XNA) que aumentan con el tiempo ... Sin embargo, no hay perfilador (dotTrace , Ants, CLR Profiler) pueden encontrar estos objetos; no se muestran en el montón y CLRProfiler afirma que nunca se asignan.
Así que miro en WinDbg - una vez más puedo ver una creciente cola de Finalizer llena de Texture2D. fReachable está vacío y afirma que todos esos objetos están en el montón de todos modos.
*0:038> !finalizequeue
SyncBlocks to be cleaned up: 0
MTA Interfaces to be released: 0
STA Interfaces to be released: 0
----------------------------------
generation 0 has 1881 finalizable objects (33e365b0->33e38314)
generation 1 has 41580 finalizable objects (33e0dc00->33e365b0)
generation 2 has 685816 finalizable objects (33b70020->33e0dc00)
Ready for finalization 0 objects (33e38314->33e38314)
MT Count TotalSize Class Name
......snip......
00ce67e0 726827 49424236 Microsoft.Xna.Framework.Graphics.Texture2D*
Entonces busque los 726.000 casos de modo que pueda encontrar quién es su propietario. El problema es que dumpheap dice que solo hay 218. Eso es más o menos lo que espero y lo que los perfiladores administrados me dicen que existe.
*0:038> !dumpheap -stat -type Microsoft.Xna.Framework.Graphics.Texture2D
total 0 objects
Statistics:
MT Count TotalSize Class Name
00ce67e0 218 14824 Microsoft.Xna.Framework.Graphics.Texture2D
Total 218 objects*
Entonces, ¿de dónde viene el resto de los elementos en la cola del finalizador? En este momento, sospecho que la creciente cola del finalizador para las asignaciones de memoria a medida que crece y, por lo tanto, sale OOM. Es como si esos 218 elementos se agregaran a la cola del Finalizador varias veces por algún motivo.
Muchas gracias
Andy
no podía ser de la misma instancia que se está re-añadió
Mencionas los gen0/1/2 montones, pero ¿y el montón de objetos grandes? ¿Es estable? ¿Qué quiere decir la gente en general con "tamaño de pila"? ¿Son los tamaños combinados de todos los objetos de ese montón, o el tamaño de la memoria reservada para el montón? Si la fragmentación es alta, estos dos valores pueden divergir. – Joh
Sí, lo siento por no mencionar que el LOH también es muy estable, como lo es el contador de bytes en todos los montones. En general estoy hablando de los contadores perfmon para los tamaños. Cuando miré el diseño de la dirección del perfilador CLR, el LOH no está muy fragmentado y su tamaño general no está creciendo. Pero volveré y comprobaré eso. Gracias –