Domanda

C'è un'API .NET per ottenere informazioni dettagliate sull'uso di VM? Sono specificamente interessati a determinare il modo frammentato il mio spazio indirizzo è.

Grazie!

È stato utile?

Soluzione

Il tipo di funzioni API di Windows che si può dare una certa comprensione in questo sono VirtualQueryEx () per enumerare le sezioni di memoria virtuale e scoprire lo spazio inutilizzato, GetProcessHeaps () per trovare quello cumuli vengono creati all'interno del processo e HEAPWALK () per scoprire come vengono utilizzati i blocchi in ogni mucchio.

Questo non sarà facile, particolarmente HEAPWALK () è una funzione fastidioso in un programma in esecuzione. Si dovrebbe dare un'occhiata ai SysInternals' VMMap utilità , è fornisce eccellenti diagnostica della memoria virtuale.

La caduta di questo è che in realtà non aiuta a risolvere un problema di frammentazione della memoria. Non c'è niente che puoi fare per influenzare il modo in cui il gestore della memoria di Windows sub-alloca lo spazio di memoria virtuale. Breve da non allocazione di memoria. Se siete alle prese ora con OOM, si dovrebbe davvero prendere in considerazione ri-architecting vostra applicazione. O il passaggio a un sistema operativo a 64 bit, la soluzione dei due cento dollari.

Altri suggerimenti

Risposta breve: no. È necessario sfruttare le API Win32 per questo. Io davvero non so cosa chiamata API si usa però ...

Una rapida ricerca su http://www.pinvoke.net mi ha portato a questo:

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

Ma la struct MEMORYSTATUS non sembra avere tutte le informazioni che ti servono (solo utilizzo della memoria fisica e virtuale e altre informazioni).

Si dovrebbe scavare intorno MSDN per trovare il metodo necessario.

Una simile chiamata non ha senso nel mondo gestito, dal momento che diversi host CLR possono gestire le cose diverse (come l'applicazione host o SQL Server normale). E non dimenticate che il GC può muovere le cose intorno, in modo che la frammentazione non è davvero un problema è il GC compatta il mucchio.

Tuttavia, questo mi porta al punto successivo, si dovrebbe essere in grado di ottenere tali informazioni ospitando il CLR da soli. Si consiglia di guardare questo post del blog su questo argomento .

È veramente a scendere in API Win32 / Win64 per ottenere queste informazioni a livello di pagina. Qualsiasi più dettagliata e avete bisogno di conoscere il funzionamento interno di qualsiasi ammasso si sta guardando, se il suo un mucchio C, Win32 mucchio, un CLR mucchietto oggetto o un CLR gran mucchio oggetto.

Tuttavia è possibile utilizzare memoria virtuale Validator (che è commerciale, ma gratuito) per visualizzare lo spazio di memoria virtuale, e anche esaminare la pagina di spazio di memoria per pagina e paragrafo per paragrafo. Guardate le immagini prima come che lo rende facile vedere problemi generali e le tendenze. Poi guardate le informazioni dettagliate su pagine e paragrafi quando hai deciso ciò che la memoria aree sono problematici.

Ecco un articolo del blog che descrive ciò che pagine e paragrafi sono.

In C si può scrivere qualcosa di simile per conoscere la quantità di memoria allocata:

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;
    }
}

I GetProcessHeaps () può essere richiesto se altri cumuli vengono utilizzati in questo caso è necessario un secondo ciclo di passare attraverso tutti i cumuli. Non so perché il loro sarebbe stato più di un però.

Nel tuo caso, probabilmente si dovrebbe contare il numero di blocchi e le loro dimensioni. Se si desidera salvare che su disco, ti suggerisco di prima conta il numero di blocchi, allocare un buffer di salvare tutte le informazioni, quindi salvare il buffer in un file per la revisione successiva.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top