Speicher optimieren in ABAP: Wann und wie Sie FREE für interne Tabellen und Strings einsetzen

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die FREE-Anweisung in ABAP dient dazu, den Speicherplatz, der von bestimmten, oft speicherintensiven Datenobjekten belegt wird, explizit freizugeben und diesen Speicher dem System (genauer: dem aktuellen internen Modus/Kontext) wieder zur Verfügung zu stellen. Gleichzeitig wird die Variable, auf die FREE angewendet wird, auf ihren * typspezifischen Initialwert zurückgesetzt*.

Der Hauptfokus von FREE liegt auf dem Speichermanagement, insbesondere bei:

  • Internen Tabellen: Freigabe des Speichers für die Tabellenzeilen und die interne Verwaltung der Tabelle.
  • Strings (STRING, XSTRING): Freigabe des Speichers, der den Inhalt der (potenziell langen) Zeichen- oder Byteketten hält.
  • Referenzvariablen (REF TO ...): Zurücksetzen der Referenz auf NULL.

Für einfache elementare Datentypen verhält sich FREE wie CLEAR.

Syntax

1. Freigeben eines einzelnen Datenobjekts

FREE <datenobjekt>.
  • <datenobjekt>: Der Name der Variablen (insbesondere interne Tabelle, String, Referenz oder Struktur), deren Speicher freigegeben werden soll.

2. Freigeben mehrerer Datenobjekte (Kettenanweisung)

FREE: <datenobjekt1>, <datenobjekt2>, ..., <datenobjektN>.

Funktionsweise und Effekt auf verschiedene Datentypen

FREE setzt die Variable immer auf ihren Initialwert zurück. Zusätzlich wird Speicher freigegeben:

Interne Tabellen (Standard, Sorted, Hashed)

  • Alle Zeilen werden gelöscht (wie bei CLEAR).
  • Der für die Zeilen und für die interne Verwaltung der Tabelle (z. B. Hash-Administration, Indexverwaltung) belegte Speicher wird freigegeben. Dies ist der Hauptunterschied zu CLEAR, das primär den Speicher der Zeilen freigibt. FREE ist hier “gründlicher”.

Strings (STRING, XSTRING)

  • Der Speicher, der den eigentlichen Inhalt des Strings hält, wird freigegeben.
  • Die Variable wird zu einem leeren String ('') bzw. Byte-String.

Referenzvariablen (TYPE REF TO ...)

  • Die Referenzvariable wird auf NULL gesetzt (zeigt auf nichts mehr).
  • Wenn es sich um eine Objektreferenz handelt und dies die letzte Referenz auf das Objekt war, kann der Garbage Collector das Objekt und dessen Speicher freigeben.

Strukturen

  • FREE wird auf jede Komponente der Struktur einzeln angewendet.
  • Für Komponenten, die interne Tabellen, Strings oder Referenzen sind, gilt die jeweilige FREE-Logik.
  • Für andere elementare Komponenten (z. B. I, P, C, D) wirkt FREE wie CLEAR.

Elementare Typen (außer Strings/Referenzen)

  • Für Typen wie I, P, F, C, N, D, T, X ist FREE funktional identisch zu CLEAR. Es setzt die Variable auf ihren Initialwert zurück. Es gibt hier keinen zusätzlichen Speichervorteil durch FREE.

Abgrenzung zu CLEAR

MerkmalCLEAR <variable>FREE <variable>
Wert zurücksetzenJa, auf InitialwertJa, auf Initialwert
SpeicherfreigabePrimär: Speicher der Zeilen bei internen Tabellen.Umfassender: Speicher von Zeilen und Verwaltung bei Tabellen; Speicher von Strings/Referenzen.
Anwendung bei TypenAlle TypenAlle Typen (aber nur bei Tabellen, Strings, Referenzen “effektiver” als CLEAR)
HauptzweckWert zurücksetzenSpeicher freigeben (+ Wert zurücksetzen)

Wann sollte FREE verwendet werden?

  • Wenn große interne Tabellen oder sehr lange Strings nicht mehr benötigt werden und der Speicher explizit und möglichst vollständig freigegeben werden soll.
  • In langlaufenden Programmen (Batch-Jobs, Daemons), wo Speicherlecks oder unnötige Speicherbelegung vermieden werden müssen.
  • In speicherkritischen Anwendungsbereichen.
  • Für einfache elementare Variablen ist CLEAR normalerweise ausreichend und drückt die Absicht (Wert zurücksetzen) oft besser aus.

Beispiele

1. Interne Tabelle freigeben

DATA: itab TYPE STANDARD TABLE OF i,
mem_info_before TYPE abap_memory_utilities=>ty_memory_usage,
mem_info_after TYPE abap_memory_utilities=>ty_memory_usage.
DO 500000 TIMES.
APPEND sy-index TO itab.
ENDDO.
mem_info_before = cl_abap_memory_utilities=>get_memory_usage_by_data( itab ).
WRITE: / 'Zeilen vor FREE:', lines( itab ).
WRITE: / 'Speicher (ca.) vor FREE:', mem_info_before-allocated_all / 1024, 'KB'.
FREE itab. " Speicher freigeben
mem_info_after = cl_abap_memory_utilities=>get_memory_usage_by_data( itab ).
WRITE: / 'Zeilen nach FREE:', lines( itab ).
WRITE: / 'Speicher (ca.) nach FREE:', mem_info_after-allocated_all / 1024, 'KB'.

Mögliche Ausgabe (Speicherwerte sind systemabhängig!):

Zeilen vor FREE: 500000
Speicher (ca.) vor FREE: 4.010 KB
Zeilen nach FREE: 0
Speicher (ca.) nach FREE: 0 KB

2. String freigeben

DATA huge_string TYPE string.
huge_string = 'Start'.
DO 15 TIMES. " Vorsicht, wird sehr groß!
huge_string = huge_string && huge_string.
ENDDO.
WRITE: / 'Länge vor FREE:', strlen( huge_string ).
FREE huge_string.
WRITE: / 'Länge nach FREE:', strlen( huge_string ). " Ausgabe: 0
WRITE: / 'Inhalt nach FREE:', |'{ huge_string }'|. " Ausgabe: ''

3. Struktur mit Tabelle freigeben

TYPES: BEGIN OF ty_container,
id TYPE string,
content TYPE STANDARD TABLE OF i WITH EMPTY KEY,
END OF ty_container.
DATA container TYPE ty_container.
container-id = 'Container 1'.
APPEND 1 TO container-content.
APPEND 2 TO container-content.
WRITE: / 'Vor FREE - ID:', container-id, 'Zeilen:', lines( container-content ).
FREE container.
WRITE: / 'Nach FREE - ID:', container-id, 'Zeilen:', lines( container-content ).

Ausgabe:

Vor FREE - ID: Container 1 Zeilen: 2
Nach FREE - ID: Zeilen: 0

4. Einfache Variable (wie CLEAR)

DATA value TYPE p DECIMALS 2 VALUE '123.45'.
WRITE: / 'Wert vor FREE:', value.
FREE value.
WRITE: / 'Wert nach FREE:', value. " Ausgabe: 0.00

Zusammenfassend: FREE ist ein spezialisiertes Werkzeug für das Speichermanagement in ABAP, das über die Funktionalität von CLEAR hinausgeht, indem es Speicher von internen Tabellen, Strings und Referenzen aggressiver freigibt. Es setzt die Variable dabei auch auf ihren Initialwert zurück. Setzen Sie es gezielt ein, wenn Speicheroptimierung für diese Objekttypen erforderlich ist.