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 aNULL.
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.FREEest 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
FREEest applique individuellement a chaque composant de la structure.- Pour les composants qui sont des tables internes, chaines ou references, la logique
FREErespective s’applique. - Pour les autres composants elementaires (ex.
I,P,C,D),FREEagit commeCLEAR.
Types elementaires (sauf chaines/references)
- Pour les types comme
I,P,F,C,N,D,T,X,FREEest fonctionnellement identique aCLEAR. Il reinitialise la variable a sa valeur initiale. Il n’y a pas d’avantage memoire supplementaire avecFREEici.
Difference avec CLEAR
| Caracteristique | CLEAR <variable> | FREE <variable> |
|---|---|---|
| Reinitialiser la valeur | Oui, a la valeur initiale | Oui, a la valeur initiale |
| Liberation memoire | Principalement : Memoire des lignes pour tables internes. | Plus complete : Memoire des lignes et gestion pour tables ; memoire des chaines/references. |
| Application aux types | Tous les types | Tous les types (mais plus “efficace” que CLEAR uniquement pour tables, chaines, references) |
| Objectif principal | Reinitialiser la valeur | Liberer 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,
CLEARest 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: 500000Memoire (env.) avant FREE: 4.010 KBLignes apres FREE: 0Memoire (env.) apres FREE: 0 KB2. 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 : 0WRITE: / '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: 2Apres FREE - ID: Lignes: 04. 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.00En 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.