Warum Mechanismus Heap (M1) geringer Fragmentierung auf einigen Computern möglicherweise deaktiviert, die Windows Server 2003, Windows XP oder Windows 2000 ausgeführt werden

Gilt für: Microsoft Windows Server 2003 Enterprise Edition (32-bit x86)Microsoft Windows Server 2003 Standard Edition (32-bit x86)Microsoft Windows XP Professional

Einführung


Auf einigen Computern mit Microsoft Windows Server 2003, Microsoft Windows XP oder Microsoft Windows 2000, möglicherweise geringer Fragmentierung Heap (M1) Mechanismus deaktiviert. Dieser Artikel beschreibt, wie dieses Verhalten verursacht. Außerdem wird beschrieben, wie Sie dieses Verhalten verhindern.

Weitere Informationen


Fragmentierung des Heaps

Zuweisung von Heap-Speicher ist Speicher über einen großen Pool von nicht verwendeten Speicher zugewiesen. Dieser Pool wird als Heapbezeichnet.

Wenn der verfügbare Speicher in kleinen, nicht zusammenhängende Blöcke aufgeteilt wird, wird dies als Fragmentierung des Heaps bezeichnet. Tritt Fragmentierung des Heaps kann Speicher reservieren fehl, auch wenn genügend Arbeitsspeicher im Heap für die Anforderung. Dieses Verhalten ist kein ein Speicherblock, der groß genug ist, zu die Reservierung angefordert. Bei Programmen, die wenig Speicherplatz reicht der standard-Heap. Fragmentierung des Heaps führen in der Regel nicht Reservierungsfehler. Jedoch kann, wenn die Anwendung häufig Speicher reserviert und verwendet eine Vielzahl von Belegungsgrößen Speicher reservieren Fragmentierung des Heaps scheitern.

Heaps mit geringer Fragmentierung

Geringer Fragmentierung Heap Mechanismus (M1) wurde in Windows 2000 eingeführt und ist in Windows XP und Windows Server 2003 enthalten. Obwohl dieser Mechanismus auf dem vorhandenen Heap erstellt wird, verringert sich erfolgreich Fragmentierung des Heap-Speicher.
Klicken Sie für weitere Informationen auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:

816542 das Windows XP geringer Fragmentierung Heap-Algorithmus Feature steht für Windows 2000

Programme viel Arbeitsspeicher in verschiedenen Belegungsgrößen reservieren, ist eine optimale verwenden M1. M1 weist Speicherblöcke, die so groß wie 16 Kilobyte (KB). Der M1 verwendet Speicherblöcke, die größer als 16 KB standard-Heap. Weitere Informationen finden Sie auf der folgenden Microsoft-Website:M1-Algorithmus minimiert die Heapfragmentierung. Außerdem verbessert der M1-Algorithmus Win32-Heap Leistung. Dieser Algorithmus arbeitet variabler Länge Speicherblöcke reservieren oder Freigeben von Speicherblöcken mit variabler Länge. Der Algorithmus lässt sich auch auf Multiprozessor-Computern.

Warum können Sie nicht die M1 aktivieren

Sie können der M1 aktivieren, wenn Sie bestimmte globale Flags (Gflags) verwenden, die auf den Heap zusammenhängen. Lassen sich diese Gflags mit dem Tool Gflags in vielen Versionen von Windows enthalten ist, aufgenommen und ist ebenfalls in Windows debugging Tools. Weitere Informationen zu diesen debugging Tools finden Sie auf der folgenden Microsoft-Website:Klicken Sie für weitere Informationen auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:

243043 wie Registrierungswert GlobalFlag Gflags.exe Werkzeug

Globale Flags, die M1 deaktivieren

Obwohl globale Flags Debuggen verwendet werden, können Sie die M1 bei ihrer Verwendung versehentlich deaktivieren. Das Tool Gflags können verschiedene globale Flags für ein Programm aktivieren. Führen Sie das Gflags-Tool von der Befehlszeile aus oder können Sie das Dialogfeld graphical User Interface (GUI) das Gflags-Tool ausführen. Bei Verwendung das GUI-Dialogfeld müssen Sie verschiedene globale Kennzeichen Optionen auf der Registerkarte Bild in das Tool Gflags festlegen. Weitere Informationen zu Befehlszeilenoptionen finden Sie auf der folgenden Microsoft TechNet Web Site:Beispielsweise können die folgenden Befehle an der Befehlszeile die globalen Flags installieren oder deinstallieren Sie die globalen Flags für das Programm Notepad Sie:
gflags /i notepad.exe +hpc
GFlags i notepad.exe-hpc

Der erste Befehl installiert die globalen Flags und der zweite Befehl deinstalliert die globalen Flags. In diesen Befehlen bedeutet "Hpc" "Heapprüfung Parameter aktivieren." Beim Aktivieren eines globalen Flags erstellen Sie einen Hexadezimalwert für das Programm Unterschlüssel unter dem folgenden Registrierungsunterschlüssel:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
Wenn das globale Flag für ein Programm festlegen, z. B. ein Registrierungseintrag, der dem folgenden ähnelt erstellt:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image Datei Ausführung Neustartoptionen\ < Myprogram.exe >
Name: GlobalFlag
Typ: DWORD
Wert: 0 x 00000040
Sie können die folgenden Optionen auf der Registerkarte Bild in das Tool Gflags festlegen.
GflagWertBeeinflusst M1?
Beenden Sie auf Ausnahme00000001Nein
Stapel-Erweiterung deaktivieren00010000Nein
Ladeprogramm Snapshots anzeigen00000002Nein
Heapprüfung Tail aktivieren00000010Ja
Kritische Pausen System aktivieren100000Nein
Heap frei Überprüfung aktivieren00000020Ja
Deaktivieren von Heap auf Verschmelzen200000Nein
Heapprüfung Parameter aktivieren00000040Ja
Heap-Überprüfung auf Abruf aktivieren00000080Ja
AppVerifier aktivieren00000100Nein
Page-Heap aktivieren02000000Ja
Heap tagging aktivieren00000800Ja
Modus Stack Trace Datenbank erstellen00001000Nein
Frühe kritischen Abschnitt Ereignis erstellen10000000Nein
Aktivieren der Heap tagging von DLL00008000Nein
Geschützte DLL-Überprüfung deaktivieren80000000Nein
Hinweis Wenn Sie mehr als eine Gflag festlegen, werden der Wert des Registrierungseintrags der Summe der Werte der Gflags festlegen.

PageHeapFlags festlegen

PageHeapFlags Registrierungseintrag befindet sich separat unter dem folgenden Registrierungsunterschlüssel:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image Datei Ausführung Neustartoptionen\ < My_Program.exe >
PageHeapFlags Registrierungseintrag wird mit GlobalFlag Registrierungswerte verwendet. Wenn Sie beschäftigt sind, debugging oder der Verfolgung eines Problems mithilfe der Microsoft Product Support Services empfohlen den PageHeapFlags Wert 0 stets beibehalten.

Verwendung des Gflags-Tools der Seitenheap zu aktivieren, wird der Wert des Registrierungseintrags PageHeapFlags 0 x 00000003 festgelegt. Seitenheap aktivieren Sie das Kontrollkästchen deaktivieren und die Änderungen nicht gelöscht oder ändern Sie den Wert des Registrierungseintrags PageHeapFlags. Durch Deaktivieren dieses Kontrollkästchens wird stattdessen GlobalFlag Wert für den Seitenheap 0. Einstellung dieser Wert 0 überschreibt und das Verhalten, das mit den Registrierungseintrag PageHeapFlags konfiguriert ist. Alternativ können Sie den Registrierungseintrag PageHeapFlags löschen oder ändern Sie den Wert manuell auf 0, ohne das Tool Gflags.

Andere Flags, die M1 deaktivieren

Darüber hinaus können die folgenden Gflags M1 auch deaktivieren.

Das HEAP_NO_SERIALIZE-flag

Standardmäßig ist das Flag HEAP_NO_SERIALIZE API HeapAlloc() nicht festgelegt. Bei der Serialisierung Heap Access zwei oder mehr Threads können Speicher und können gleichzeitig Speicher aus dem gleichen Heap frei. Dieses Flag ist M1 deaktiviert. Wenn dieses Flag festgelegt ist, bedeutet dies, dass wechselseitigen Ausschluss nicht verwendet wird, wenn die Heapfunktionen Speicherplatz von diesem Heap reservieren.

Das HEAP_GROWABLE-flag

Wenn das Flag HEAP_GROWABLE nicht als Flag auf RtlCreateHeal() festgelegt ist, wird M1 deaktiviert. Wenn der Heap erweitert werden kann, möglicherweise nicht genügend Speicherplatz im Heap für die Anwendung aufgrund der großen Speicherbedarf M1. Durch Festlegen dieses Flags kann Heap nach Bedarf wachsen. Wenn die Adresse HeapBase NULL ist, geben Sie dieses Flag.

Debugger deaktivieren M1 verhindern

Bei Verwendung ein Debuggers kann M1 nicht erwartungsgemäß. Dieses Verhalten kann auftreten, wenn mehrere Debugoptionen. In der Standardeinstellung werden diese Optionen werden häufig Debuggen. Um dieses Problem zu vermeiden, verwenden Sie eine der folgenden Methoden.

Methode 1

Wenn Sie den WinDbg-Debugger oder den Cdb-Debugger verwenden, können Sie den folgenden Befehl, Heap Debugoptionen deaktivieren:
-hd

Methode 2

Sie können den WinDbg-Debugger oder den Cdb-Debugger verhindern, M1 mit dem folgenden Befehl eine Umgebungsvariable zu deaktivieren:
Legen Sie NO_DEBUG_HEAP = 1
Sie können auch die folgende Einstellung für das Bild. Jedoch empfohlen nicht die Einstellung dringend.
Legen Sie NtGlobalFlags = 0