Frage

Gibt es eine .NET-API für detaillierte Informationen bekommen auf VM verwenden? Ich bin speziell interessiert bei der Bestimmung, wie mein Adressraum fragmentiert ist.

Danke!

War es hilfreich?

Lösung

Die Art der Windows-API-Funktionen, die Ihnen einen Einblick in das geben kann, sind VirtualQueryEx () die virtuellen Speicherabschnitte aufzuzählen und zu entdecken ungenutzten Raum, GetProcessHeaps () zu finden, was Haufen innerhalb des Prozesses erstellt werden und HEAPWALK () zu entdecken wie Blöcke in jeder Halde verwendet.

Dies ist nicht einfach sein, besonders HEAPWALK () ist eine lästige Funktion in einem laufenden Programm. Sie sollten einen Blick auf das Sysinternals' VMMap Dienstprogramm nehmen, es bietet eine hervorragende virtuellen Speicher-Diagnose.

Der Untergang dabei ist, dass sie nicht wirklich helfen, eine Speicherfragmentierung Problem zu lösen. Es gibt nichts, was man tun kann, wie die Windows-Speichermanager beeinflussen den virtuellen Speicherraum Unter zuordnet. Short aus nicht dem Zuweisen von Speicher. Wenn Sie jetzt mit OOM zu kämpfen haben, sollten Sie wirklich wieder Architecting Ihre Anwendung betrachten. Oder Umstellung auf ein 64-Bit-Betriebssystem, die zweihundert Dollar-Lösung.

Andere Tipps

Kurze Antwort: nein. Sie müssen tippen in die Win32-API für die. Ich weiß wirklich nicht, was API-Aufruf Sie aber ...

verwenden würden,

Eine schnelle Suche auf http://www.pinvoke.net führte mich dazu:

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

Aber die MEMORY Struktur scheint nicht alle die Informationen zu haben, die Sie benötigen (nur physische und virtuelle Speichernutzung und andere Informationen).

Sie sollten um MSDN graben die notwendige Methode zu finden.

Ein solcher Anruf macht keinen Sinn in der verwalteten Welt machen, da verschiedene CLR-Hosts Dinge handhaben können verschiedene (wie bei der normalen Anwendung Host oder SQL Server). Und nicht vergessen, dass die GC Dinge können sich frei bewegen, so dass die Fragmentierung nicht wirklich ein Problem ist, ist der GC den Heap verdichtet.

Doch das bringt mich zum nächsten Punkt, sollten Sie in der Lage sein, diese Informationen zu erhalten, indem die CLR selbst hosten. Sie können unter dieses Blog-Post zu diesem Thema aussehen wollen .

Sie haben wirklich in den Win32 / Win64 API erhalten Sie sich diese Informationen auf der Seitenebene zu erhalten. Mehr detailliert und Sie müssen wissen, die internen Abläufe je nachdem, was Haufen Sie betrachten, ob es ein C-Heap, Win32 Haufen, ein CLR kleinen Objektheap oder eine CLR große Objektheap.

Sie können jedoch verwenden Virtual Memory Validator (die kommerzielle, aber frei), um den virtuellen Speicherraum sichtbar zu machen, und auch die Speicherplatz Seite für Seite und Absatz für Absatz untersuchen. zuerst auf der Optik aussehen wie das macht es leicht, allgemeine Probleme und Trends zu sehen. Schauen Sie sich die ausführlichen Infos auf den Seiten und Absätze, wenn Sie sich entschieden haben, welche Speicherbereiche problematisch sind.

Hier ist ein Blog-Artikel beschreibt, was Seiten und Absätze sind.

C Sie so etwas schreiben kann zu wissen, wie viel Speicher zugewiesen wird:

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

Die GetProcessHeaps () erforderlich sein, wenn andere Haufen verwendet werden, in dem Fall, dass Sie eine zweite Schleife muß durch alle die Haufen zu gehen. Ich weiß nicht, warum sie wäre mehr als ein though.

In Ihrem Fall sollten Sie vielleicht die Anzahl der Blöcke und die Größen zählen. Wenn Sie speichern möchten, dass auf der Festplatte, empfehle ich Ihnen zuerst die Anzahl der Blöcke zählen, weisen einen Puffer um alle Informationen zu speichern, speichern Sie die Puffer in einer Datei zur späteren Überprüfung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top