Optimizar memoria en ABAP: Cuando y como usar FREE para tablas internas y strings

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

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 a NULL.

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. FREE es “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

  • FREE se aplica a cada componente de la estructura individualmente.
  • Para componentes que son tablas internas, strings o referencias, se aplica la logica de FREE respectiva.
  • Para otros componentes elementales (por ejemplo, I, P, C, D) FREE actua como CLEAR.

Tipos elementales (excepto Strings/Referencias)

  • Para tipos como I, P, F, C, N, D, T, X, FREE es funcionalmente identico a CLEAR. Restablece la variable a su valor inicial. No hay ventaja de memoria adicional con FREE aqui.

Diferencia con CLEAR

CaracteristicaCLEAR <variable>FREE <variable>
Restablecer valorSi, a valor inicialSi, a valor inicial
Liberacion de memoriaPrincipalmente: Memoria de filas en tablas internas.Mas completo: Memoria de filas y administracion en tablas; Memoria de strings/referencias.
Aplicacion en tiposTodos los tiposTodos los tipos (pero solo “mas efectivo” que CLEAR en tablas, strings, referencias)
Proposito principalRestablecer valorLiberar 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, CLEAR es 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: 500000
Memoria (aprox.) antes de FREE: 4.010 KB
Filas despues de FREE: 0
Memoria (aprox.) despues de FREE: 0 KB

2. 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: 0
WRITE: / '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: 2
Despues de FREE - ID: Filas: 0

4. 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.00

En 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.