Optimiser la memoire en ABAP : Quand et comment utiliser FREE pour les tables internes et les chaines

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction FREE en ABAP sert a liberer explicitement l’espace memoire occupe par certains objets de donnees souvent gourmands en memoire et a remettre cette memoire a la disposition du systeme (plus precisement : du mode interne/contexte actuel). En meme temps, la variable sur laquelle FREE est applique est reinitialise a sa valeur initiale specifique au type.

L’objectif principal de FREE est la gestion de la memoire, en particulier pour :

  • Tables internes : Liberation de la memoire pour les lignes de table et la gestion interne de la table.
  • Chaines (STRING, XSTRING) : Liberation de la memoire contenant le contenu des chaines de caracteres ou d’octets (potentiellement longues).
  • Variables de reference (REF TO ...) : Reinitialisation de la reference a NULL.

Pour les types de donnees elementaires simples, FREE se comporte comme CLEAR.

Syntaxe

1. Liberer un seul objet de donnees

FREE <objet_donnees>.
  • <objet_donnees> : Le nom de la variable (en particulier table interne, chaine, reference ou structure) dont la memoire doit etre liberee.

2. Liberer plusieurs objets de donnees (instruction chainee)

FREE: <objet_donnees1>, <objet_donnees2>, ..., <objet_donneesN>.

Fonctionnement et effet sur differents types de donnees

FREE reinitialise toujours la variable a sa valeur initiale. De plus, la memoire est liberee :

Tables internes (Standard, Sorted, Hashed)

  • Toutes les lignes sont supprimees (comme avec CLEAR).
  • La memoire occupee par les lignes et la gestion interne de la table (ex. administration du hachage, gestion d’index) est liberee. C’est la difference principale avec CLEAR, qui libere principalement la memoire des lignes. FREE est plus “complet” ici.

Chaines (STRING, XSTRING)

  • La memoire contenant le contenu reel de la chaine est liberee.
  • La variable devient une chaine vide ('') ou une chaine d’octets vide.

Variables de reference (TYPE REF TO ...)

  • La variable de reference est mise a NULL (ne pointe plus vers rien).
  • S’il s’agit d’une reference d’objet et que c’etait la derniere reference vers cet objet, le Garbage Collector peut liberer l’objet et sa memoire.

Structures

  • FREE est applique individuellement a chaque composant de la structure.
  • Pour les composants qui sont des tables internes, chaines ou references, la logique FREE respective s’applique.
  • Pour les autres composants elementaires (ex. I, P, C, D), FREE agit comme CLEAR.

Types elementaires (sauf chaines/references)

  • Pour les types comme I, P, F, C, N, D, T, X, FREE est fonctionnellement identique a CLEAR. Il reinitialise la variable a sa valeur initiale. Il n’y a pas d’avantage memoire supplementaire avec FREE ici.

Difference avec CLEAR

CaracteristiqueCLEAR <variable>FREE <variable>
Reinitialiser la valeurOui, a la valeur initialeOui, a la valeur initiale
Liberation memoirePrincipalement : Memoire des lignes pour tables internes.Plus complete : Memoire des lignes et gestion pour tables ; memoire des chaines/references.
Application aux typesTous les typesTous les types (mais plus “efficace” que CLEAR uniquement pour tables, chaines, references)
Objectif principalReinitialiser la valeurLiberer la memoire (+ reinitialiser la valeur)

Quand utiliser FREE ?

  • Lorsque de grandes tables internes ou de tres longues chaines ne sont plus necessaires et que la memoire doit etre liberee explicitement et aussi completement que possible.
  • Dans les programmes a longue duree d’execution (jobs batch, daemons), ou les fuites de memoire ou l’occupation memoire inutile doivent etre evitees.
  • Dans les domaines d’application critiques en memoire.
  • Pour les variables elementaires simples, CLEAR est normalement suffisant et exprime souvent mieux l’intention (reinitialiser la valeur).

Exemples

1. Liberer une table interne

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: / 'Lignes avant FREE:', lines( itab ).
WRITE: / 'Memoire (env.) avant FREE:', mem_info_before-allocated_all / 1024, 'KB'.
FREE itab. " Liberer la memoire
mem_info_after = cl_abap_memory_utilities=>get_memory_usage_by_data( itab ).
WRITE: / 'Lignes apres FREE:', lines( itab ).
WRITE: / 'Memoire (env.) apres FREE:', mem_info_after-allocated_all / 1024, 'KB'.

Sortie possible (les valeurs memoire dependent du systeme !) :

Lignes avant FREE: 500000
Memoire (env.) avant FREE: 4.010 KB
Lignes apres FREE: 0
Memoire (env.) apres FREE: 0 KB

2. Liberer une chaine

DATA huge_string TYPE string.
huge_string = 'Start'.
DO 15 TIMES. " Attention, devient tres grand !
huge_string = huge_string && huge_string.
ENDDO.
WRITE: / 'Longueur avant FREE:', strlen( huge_string ).
FREE huge_string.
WRITE: / 'Longueur apres FREE:', strlen( huge_string ). " Sortie : 0
WRITE: / 'Contenu apres FREE:', |'{ huge_string }'|. " Sortie : '"

3. Liberer une structure avec table

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: / 'Avant FREE - ID:', container-id, 'Lignes:', lines( container-content ).
FREE container.
WRITE: / 'Apres FREE - ID:', container-id, 'Lignes:', lines( container-content ).

Sortie :

Avant FREE - ID: Container 1 Lignes: 2
Apres FREE - ID: Lignes: 0

4. Variable simple (comme CLEAR)

DATA value TYPE p DECIMALS 2 VALUE '123.45'.
WRITE: / 'Valeur avant FREE:', value.
FREE value.
WRITE: / 'Valeur apres FREE:', value. " Sortie : 0.00

En resume : FREE est un outil specialise pour la gestion memoire en ABAP, qui va au-dela de la fonctionnalite de CLEAR en liberant plus agressivement la memoire des tables internes, chaines et references. Il reinitialise egalement la variable a sa valeur initiale. Utilisez-le de maniere ciblee lorsque l’optimisation memoire est necessaire pour ces types d’objets.