Pregunta

¿Existe una API .NET para obtener información detallada sobre el uso de VM? Estoy interesado específicamente en la determinación de cómo se fragmentó mi espacio de direcciones es.

Gracias!

¿Fue útil?

Solución

El tipo de funciones API de Windows que le puede dar una idea de esto son VirtualQueryEx () para enumerar las secciones de memoria virtual y descubrir el espacio no utilizado, GetProcessHeaps () para encontrar lo que montones son creados dentro del proceso y HEAPWALK () para descubrir cómo se utilizan los bloques en cada montón.

Esto no va a ser fácil, sobre todo HEAPWALK () es una función problemático en un programa que se ejecuta. Usted debe echar un vistazo a las SysInternals' VMMap utilidad , se proporciona excelentes diagnósticos de memoria virtual.

La caída con esto es que realmente no ayuda a resolver un problema de la fragmentación de memoria. No hay nada que puede hacer para afectar a la forma en que el administrador de memoria de Windows sub-asigna el espacio de memoria virtual. Corto de no asignar memoria. Si usted está luchando ahora con OOM, que realmente debería considerar volver a la arquitectura de su aplicación. O cambiar a un sistema operativo de 64 bits, la solución de doscientos dólares.

Otros consejos

Respuesta corta: no. Es necesario aprovechar la API de Win32 para eso. Realmente no sé qué llamada a la API que usaría aunque ...

Una búsqueda rápida en http://www.pinvoke.net me llevó a esto:

[DllImport("coredll.dll", SetLastError=true)]
static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);

Sin embargo, la estructura MEMORYSTATUS no parecen tener toda la información que necesita (solo uso de la memoria física y virtual y otra información).

Usted debe cavar alrededor de MSDN para encontrar el método necesario.

una llamada de este tipo no tiene sentido en el mundo administrado, ya que diferentes hosts CLR pueden manejar las cosas diferentes (como el anfitrión de aplicación normal o SQL Server). Y no hay que olvidar que la GC puede mover las cosas, de modo que la fragmentación no es realmente un problema es la GC compacta el montón.

Sin embargo, esto me lleva al siguiente punto, usted debe ser capaz de obtener esta información como anfitrión de la CLR mismo. Es posible que desee ver en este post sobre este tema .

Usted realmente tiene que bajar a la API de Win32 / Win64 para obtener esta información a nivel de página. Cualquier más detallado y lo que necesita saber el funcionamiento interno de lo que Heap que está viendo, si es un montón C, Win32 montón, un montón de objetos CLR pequeña o un montón de objetos grandes CLR.

Sin embargo, puede utilizar de memoria virtual Validador (que es comercial, pero gratis) para visualizar el espacio de memoria virtual, y también examinar la página de espacio de memoria de página y párrafo por párrafo. Mira las imágenes por primera vez como que hace que sea fácil de ver los problemas y las tendencias generales. A continuación, busque en la información detallada en las páginas y párrafos cuando se ha decidido qué áreas de memoria son problemáticos.

Aquí hay un artículo en el blog que describe lo que y párrafos son.

En C se puede escribir algo como esto para saber cuánta memoria se asigna:

HANDLE heap = GetProcessHeap();
PROCESS_HEAP_ENTRY entry;
memset(&entry, 0, sizeof(entry));
unsigned long size = 0;
while(HeapWalk(heap, &entry)) {
    if(entry.wFlags & PROCESS_HEAP_ENTRY_BUSY) {
        size += entry.cbData;
    }
}

Los GetProcessHeaps () puede ser necesaria si se utilizan otros montones en cuyo caso se necesita un segundo bucle de pasar por todos los montones. No sé por qué sus sería más de un embargo.

En su caso, probablemente debería contar el número de bloques y sus tamaños. Si desea guardar en el disco que, le sugiero que primero contar el número de bloques, asignar un búfer para guardar toda la información, a continuación, guardar el buffer en un archivo para su posterior revisión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top