Konfigurieren des Speichermanagers

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Speicherverwaltung - Index


Dieser Abschnitt beschreibt, wie der Speichermanager auf 32-Bit-Windows und 64-Bit-Windows konfiguriert wird. Andere Plattformen verwenden den Speichermanager Posix/32, der diese Funktionalität nicht unterstützt.

Hinweis: Einige Konfigurationseinstellungen des Speichermanagers können geändert werden, während der Speichermanager verwendet wird. Alle Konfigurationseinstellungen sind globale Einstellungen und wirken sich auf alle Threads aus, die den Speichermanager verwenden. Falls nicht anders angegeben, sind alle Funktionen und Prozeduren Thread-sicher. Diese Konfigurationsoptionen gelten nur für den lokalen Speichermanager. Das Setzen dieser Optionen in einer Bibliothek hat keine Auswirkungen, wenn die Bibliothek den Speichermanager der Hauptanwendung nutzt.

So setzen Sie die minimale Blockausrichtung für den Speichermanager:

  1. Ermitteln Sie mit der Funktion GetMinimumBlockAlignment die aktuelle, minimale Blockausrichtung.
  2. Wählen Sie die geeignete Speicherblockausrichtung für Ihre Anwendung aus. Verfügbare Blockausrichtungen sind 8 Byte (System.mba8byte) und 16 Byte (System.mba16byte).
  3. Zum Ändern der Speicherblockausrichtung verwenden Sie die Prozedur SetMinimumBlockAlignment.

Hinweis: Bei Speicher, der mit dem Speichermanager zugewiesen wird, ist gewährleistet, dass er an mindestens 8-Byte-Grenzen ausgerichtet ist. Eine 16-Byte-Ausrichtung ist hilfreich, wenn Speicherblöcke mit SSE-Anweisungen manipuliert werden, könnte aber das Speicherverwendungs-Overhead vergrößern.

So werden Sie beim Schließen über Speicherlecks informiert:

  1. Setzen Sie die globale Variable System.ReportMemoryLeaksOnShutdown auf True.
  2. Wenn der Speichermanager geschlossen wird, durchsucht er den Speicher-Pool und meldet alle nicht registrierten Speicherlecks in einem Meldungsdialogfeld. Um erwartete Speicherlecks zu registrieren oder deren Registrierung aufzuheben, verwenden Sie die Prozeduren RegisterExpectedMemoryLeak bzw. UnregisterExpectedMemoryLeak.

Hinweis: Der Speichermanager kann über Speicher informieren, der zugewiesen, aber zum Zeitpunkt des Schließens des Speichermanagers noch nicht freigegeben wurde. Solche Speicherblöcke werden Speicherlecks genannt und sind oft das Ergebnis von Programmierfehlern. Der Vorgabewert für System.ReportMemoryLeaksOnShutdown ist False. Die Klasse eines Lecks wird durch das erste DWord im Block bestimmt. Die gemeldeten Leckklassen sind oft nicht 100% richtig. Ein Leck wird als String-Leck gemeldet, falls es ein AnsiString zu sein scheint. Wenn der Speichermanager den Typ des Lecks nicht feststellen kann, wird es als Typ "unbekannte Klasse" gemeldet.

So behandeln Sie Thread-Konkurrenzen im Speichermanager:

  1. Setzen Sie die globale Variable System.NeverSleepOnMMThreadContentionauf True.
  2. Wenn eine Thread-Konkurrenz im Speichermanager auftritt, wird in einer Schleife gewartet, bis die Konkurrenz aufgelöst ist.

Hinweis: Der Speichermanager ist eine gemeinsam genutzte Ressource. Wenn viele Threads in der Anwendung gleichzeitig eine Speichermanageroperation auszuführen versuchen, muss ein Thread (oder mehrere) evtl. warten, bis eine anstehende Operation eines anderen Threads abgeschlossen ist, bevor der Thread fortgesetzt werden kann. Diese Situation wird Thread-Konkurrenz. genannt. Wenn eine Thread-Konkurrenz im Speichermanager auftritt, wird als Standardverhalten auf die verbleibende Zeit im Zeitabschnitt des Threads verzichtet. Wenn die Ressource beim Eintritt des Threads in den nächsten Zeitabschnitt noch nicht verfügbar ist, ruft der Speichermanager die Betriebssystemprozedur Sleep auf, damit vor dem nächsten Versuch länger gewartet wird (ca. 20 Millisekunden). Dieses Verhalten funktioniert gut bei Rechnern mit Einzel- oder dualen CPUs sowie wenn das Verhältnis der Anzahl der laufenden Threads zur Anzahl der CPUs relativ hoch (größer als 2:1) ist. In anderen Situationen kann eine bessere Performance erzielt werden, indem der Thread in eine Warteschlange gestellt wird, bis die Ressource verfügbar wird. Wenn System.NeverSleepOnMMThreadContention True ist,, tritt der Speichermanager in eine Warteschleife ein. Der Vorgabewert für System.NeverSleepOnMMThreadContention ist False.

Quelltext des Speichermanagers

Der vollständige Quelltext des Speichermanagers (FastMM) steht auf SourceForge zur Verfügung:

Mit der vollständigen Version von FastMM können Sie den Speichermanager in einem speziellen "Debug-Modus" ausführen, in dem sich Heap-Fehler und Speicherlecks finden lassen. Weitere Funktionen der vollständigen Version von FastMM:

  • Doppelte Freigabe von Objekten / Interfaces
  • Dateiprotokollierung und Berichte

Weitere Informationen entnehmen Sie bitte den Kommentaren im FastMM-Quelltext (FastMM4.pas und FastMM4Options.inc).

Siehe auch