Speicherverwaltung

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Speicherverwaltung auf der Win32-Plattform - Index

Im Folgenden wird beschrieben, wie die Speicherverwaltung auf der Win32-Plattform gehandhabt wird. Außerdem finden Sie hier eine kurze Erläuterung der Speicheranforderungen von Variablen.

Der Speichermanager (nur Win32)

Der Speichermanager ist für alle Operationen zuständig, mit denen eine Anwendung dynamisch Speicher zuweist oder freigibt. Er wird von den Standardprozeduren New, Dispose, GetMem, ReallocMem und FreeMem und bei der Zuweisung von Speicher an alle Objekte und lange Strings verwendet.

Der Speichermanager ist speziell auf Anwendungen zugeschnitten, die sehr viele Blöcke kleiner bis mittlerer Größe belegen. Dies ist typisch für objektorientierte Anwendungen und für Anwendungen, die String-Daten verarbeiten. Der Speichermanager ist für eine effiziente Ausführung (Hochgeschwindigkeit und wenig Speicher-Overhead) in Einzel- und Multi-Thread-Anwendungen optimiert. Andere Speichermanager wie die Implementierungen von GlobalAlloc und LocalAlloc und die Unterstützung des privaten Heap in Windows sind in solchen Situationen weniger geeignet und verlangsamen eine Anwendung spürbar, wenn sie direkt verwendet werden.

Um die bestmögliche Leistung zu erzielen, arbeitet der Speichermanager direkt mit der Win32-API für virtuellen Speicher zusammen (über die Funktionen VirtualAlloc und VirtualFree). Der Speichermanager unterstützt einen Adressraum für den Benutzermodus von bis zu 4 GB.

Die Blöcke des Speichermanagers belegen immer ein Vielfaches von vier Byte und enthalten immer einen vier Byte großen Header, in dem die Größe des Blocks und weitere Statusbits gespeichert sind. Die Blöke sind daher immer an 8-Byte-Grenzen oder optional an 16-Byte-Grenzen ausgerichtet, was eine optimale Geschwindigkeit bei ihrer Adressierung gewähleistet.

Der Speichermanager wendet einen Algorithmus an, der künftige Neuzuweisungen von Blöcken antizipiert. Dadurch wird die Verringerung der Ausführungsgeschwindigkeit aufgehoben, die in der Regel mit solchen Operationen einhergeht. Dieser Zuweisungsalgorithmus vermindert auch die Adressraumfragmentierung.

Der Speichermanager stellt einen Mechanismus für die gemeinsame Nutzung bereit, für den keine externe DLL erforderlich ist.

Der Speichermanager enthält Berichtsfunktionen, die Anwendungen dabei unterstützen, ihre eigene Speicherverwendung und potentielle Speicherlecks zu überwachen.

Der Speichermanager stellt die beiden Prozeduren GetMemoryManagerState und GetMemoryMap bereit, über die Anwendungen Informationen über den Status des Speichermanagers und ein detailliertes Abbild der Speicherverwendung abrufen können.

Variablen

Globale Variablen werden im Datensegment der Anwendung zugewiesen und bleiben bis zur Beendigung des Programms erhalten. Lokale Variablen, die innerhalb von Prozeduren und Funktionen deklariert sind, werden auf dem Stack der Anwendung abgelegt. Wenn eine Prozedur oder Funktion aufgerufen wird, reserviert sie auf dem Stack Speicherplatz für ihre lokalen Variablen. Bei der Beendigung der Prozedur oder Funktion werden die lokalen Variablen wieder freigegeben. Variablen können aber aufgrund von Optimierungsaktionen des Compilers auch zu einem früheren Zeitpunkt freigegeben werden.

In Win32 wird der Stack einer Anwendung durch zwei Werte definiert: der Mindestgröße und der Maximalgröße. Diese Werte werden über die Compiler-Direktiven $MINSTACKSIZE und $MAXSTACKSIZE gesteuert. Die Voreinstellung lautet 16.384 (16 KB) bzw. 1.048.576 (1 MB). Eine Anwendung hat an Stack nie weniger als die Mindestgröße und nie mehr als die Maximalgröße zur Verfügung. Wenn beim Start einer Anwendung weniger Speicher zur Verfügung steht, als es der Wert für die Mindestgröße des Stack vorschreibt, gibt Windows eine entsprechende Fehlermeldung aus.

Wenn eine Win32-Anwendung mehr Stack benötigt als die angegebene Mindestgröße, wird ihr in Blöcken von vier KB automatisch weiterer Speicher zugewiesen. Schlägt die Zuweisung fehl, weil nicht mehr Speicher vorhanden ist oder die Maximalgröße des Stack überschritten würde, wird eine EStackOverflow-Exception ausgelöst. (Die Stack-Überlaufprüfung wird automatisch durchgeführt. Die Compiler-Direktive $S zum Ein- und Ausschalten dieser Prüfung wurde aber aus Gründen der Abwärtskompatibilität beibehalten.)

Der Speicher für dynamische Variablen, die Sie mit den Prozeduren GetMem oder New erzeugen, wird auf dem Heap reserviert. Die Variablen bleiben bis zu einem entsprechenden FreeMem- bzw. Dispose-Aufruf erhalten.

Lange Strings, WideStrings, dynamische Arrays, Varianten und Interfaces werden auf dem Heap zugewiesen. Ihr Speicher wird aber dennoch automatisch verwaltet.

Siehe auch

Codebeispiele