La sentencia FREE en ABAP sirve para liberar explicitamente el espacio de memoria ocupado por ciertos objetos de datos que suelen consumir mucha memoria y devolver esta memoria al sistema (mas precisamente: al modo interno/contexto actual). Al mismo tiempo, la variable sobre la que se aplica FREE se restablece a su valor inicial especifico del tipo.
El enfoque principal de FREE esta en la gestion de memoria, especialmente con:
- Tablas internas: Liberacion de la memoria para las filas de tabla y la administracion interna de la tabla.
- Strings (
STRING,XSTRING): Liberacion de la memoria que contiene el contenido de las cadenas de caracteres o bytes (potencialmente largas). - Variables de referencia (
REF TO ...): Restablecimiento de la referencia aNULL.
Para tipos elementales simples, FREE se comporta como CLEAR.
Sintaxis
1. Liberar un unico objeto de datos
FREE <objeto_datos>.<objeto_datos>: El nombre de la variable (especialmente tabla interna, string, referencia o estructura) cuya memoria debe liberarse.
2. Liberar multiples objetos de datos (sentencia encadenada)
FREE: <objeto_datos1>, <objeto_datos2>, ..., <objeto_datosN>.Funcionamiento y efecto en diferentes tipos de datos
FREE siempre restablece la variable a su valor inicial. Ademas, libera memoria:
Tablas internas (Standard, Sorted, Hashed)
- Todas las filas se eliminan (como con
CLEAR). - Se libera la memoria ocupada por las filas y por la administracion interna de la tabla (por ejemplo, administracion de hash, gestion de indices). Esta es la diferencia principal con
CLEAR, que principalmente libera la memoria de las filas.FREEes “mas exhaustivo” aqui.
Strings (STRING, XSTRING)
- Se libera la memoria que contiene el contenido real del string.
- La variable se convierte en un string vacio (
'') o byte-string.
Variables de referencia (TYPE REF TO ...)
- La variable de referencia se establece a
NULL(ya no apunta a nada). - Si es una referencia a objeto y esta era la ultima referencia al objeto, el Garbage Collector puede liberar el objeto y su memoria.
Estructuras
FREEse aplica a cada componente de la estructura individualmente.- Para componentes que son tablas internas, strings o referencias, se aplica la logica de
FREErespectiva. - Para otros componentes elementales (por ejemplo,
I,P,C,D)FREEactua comoCLEAR.
Tipos elementales (excepto Strings/Referencias)
- Para tipos como
I,P,F,C,N,D,T,X,FREEes funcionalmente identico aCLEAR. Restablece la variable a su valor inicial. No hay ventaja de memoria adicional conFREEaqui.
Diferencia con CLEAR
| Caracteristica | CLEAR <variable> | FREE <variable> |
|---|---|---|
| Restablecer valor | Si, a valor inicial | Si, a valor inicial |
| Liberacion de memoria | Principalmente: Memoria de filas en tablas internas. | Mas completo: Memoria de filas y administracion en tablas; Memoria de strings/referencias. |
| Aplicacion en tipos | Todos los tipos | Todos los tipos (pero solo “mas efectivo” que CLEAR en tablas, strings, referencias) |
| Proposito principal | Restablecer valor | Liberar memoria (+ restablecer valor) |
Cuando usar FREE?
- Cuando tablas internas grandes o strings muy largos ya no se necesitan y la memoria debe liberarse explicitamente y lo mas completamente posible.
- En programas de larga ejecucion (jobs batch, daemons), donde deben evitarse fugas de memoria o uso innecesario de memoria.
- En areas de aplicacion criticas en memoria.
- Para variables elementales simples,
CLEARes normalmente suficiente y expresa mejor la intencion (restablecer valor).
Ejemplos
1. Liberar tabla interna
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: / 'Filas antes de FREE:', lines( itab ).WRITE: / 'Memoria (aprox.) antes de FREE:', mem_info_before-allocated_all / 1024, 'KB'.
FREE itab. " Liberar memoria
mem_info_after = cl_abap_memory_utilities=>get_memory_usage_by_data( itab ).WRITE: / 'Filas despues de FREE:', lines( itab ).WRITE: / 'Memoria (aprox.) despues de FREE:', mem_info_after-allocated_all / 1024, 'KB'.Posible salida (valores de memoria dependen del sistema!):
Filas antes de FREE: 500000Memoria (aprox.) antes de FREE: 4.010 KBFilas despues de FREE: 0Memoria (aprox.) despues de FREE: 0 KB2. Liberar string
DATA huge_string TYPE string.huge_string = 'Inicio'.DO 15 TIMES. " Cuidado, se vuelve muy grande! huge_string = huge_string && huge_string.ENDDO.WRITE: / 'Longitud antes de FREE:', strlen( huge_string ).
FREE huge_string.
WRITE: / 'Longitud despues de FREE:', strlen( huge_string ). " Salida: 0WRITE: / 'Contenido despues de FREE:', |'{ huge_string }'|. " Salida: ''3. Liberar estructura con tabla
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 = 'Contenedor 1'.APPEND 1 TO container-content.APPEND 2 TO container-content.
WRITE: / 'Antes de FREE - ID:', container-id, 'Filas:', lines( container-content ).
FREE container.
WRITE: / 'Despues de FREE - ID:', container-id, 'Filas:', lines( container-content ).Salida:
Antes de FREE - ID: Contenedor 1 Filas: 2Despues de FREE - ID: Filas: 04. Variable simple (como CLEAR)
DATA value TYPE p DECIMALS 2 VALUE '123.45'.WRITE: / 'Valor antes de FREE:', value.FREE value.WRITE: / 'Valor despues de FREE:', value. " Salida: 0.00En resumen: FREE es una herramienta especializada para la gestion de memoria en ABAP que va mas alla de la funcionalidad de CLEAR al liberar de forma mas agresiva la memoria de tablas internas, strings y referencias. Tambien restablece la variable a su valor inicial. Usalo de forma selectiva cuando se requiera optimizacion de memoria para estos tipos de objetos.