Saltar al contenido principal

Módulo GC

El Garbage Collector (GC) es un componente importante en muchos lenguajes de programación modernos que manejan la gestión de memoria dinámica. El lenguaje de programación JARU también tiene su propio GC.

La tarea principal del GC es liberar la memoria que ya no se utiliza en el programa. Cuando se crea un objeto en la memoria dinámica, se asigna espacio de memoria para ese objeto. En algunos lenguajes de programación, el programador tiene que liberar manualmente la memoria asignada al objeto cuando ya no es necesaria. Esto puede ser propenso a errores y a menudo conduce a fugas de memoria.

En JARU, el GC se encarga de liberar automáticamente la memoria que ya no se usa. El GC escanea regularmente la memoria y busca objetos que ya no son accesibles. Cuando se encuentra un objeto inaccesible, se libera la memoria asociada con ese objeto.

Técnica utilizada

La técnica usada por el GC de JARU es marca y barrido (mark and sweep); esta técnica marca todos los objetos que todavía se usan en el programa y luego elimina los objetos no marcados.

Cuándo usar el módulo GC

Aunque el Garbage Collector es muy útil, a veces puede ser ineficiente para ciertas aplicaciones debido a:

  • Sobrecarga del procesador: El GC puede ser un proceso intensivo para el procesador
  • Fragmentación de la memoria: El GC puede no manejar eficazmente la fragmentación de la memoria

En algunos casos puede ser mejor para el programador manejar la gestión de memoria manualmente utilizando los comandos del módulo GC.

Funciones

collect

La función collect() se utiliza para ejecutar manualmente la recolección de basura, es decir, liberar la memoria que no está siendo utilizada por el programa.

use GC

var bytesLiberados = GC.collect()
println("Se liberaron ", bytesLiberados, " bytes")

La función collect() devuelve el número de bytes liberados durante el proceso de recolección de basura. Esto puede ser útil para monitorear el uso de memoria del programa.

Nota

Si el GC está deshabilitado, la función collect() lo habilita temporalmente para ejecutar la recolección y luego lo vuelve a deshabilitar automáticamente.

isEnable

La función isEnable() se utiliza para verificar si el recolector de basura está habilitado o deshabilitado.

use GC

if (GC.isEnable()) then
println("El GC está habilitado")
else
println("El GC está deshabilitado")
end

Devuelve true si el recolector de basura está habilitado y false si está deshabilitado.

enable

La función enable() se utiliza para habilitar la ejecución automática del recolector de basura.

use GC

GC.enable()

Cuando se llama a esta función, se habilita el recolector de basura y se establece para que se ejecute automáticamente en segundo plano.

disable

La función disable() se utiliza para desactivar la ejecución automática del recolector de basura.

use GC

GC.disable()
// Ahora el programador deberá liberar manualmente la memoria

Cuando se llama a esta función, se desactiva el recolector de basura y el programador deberá liberar manualmente la memoria que ya no se está utilizando.

Precaución

Desactivar el recolector de basura puede tener un impacto negativo en el rendimiento del programa, ya que puede consumir más memoria de la necesaria. Se recomienda dejar la ejecución automática del recolector de basura habilitada, a menos que haya una razón específica para desactivarla.

factor

La función factor() permite consultar o modificar el factor de crecimiento del heap del recolector de basura.

Consultar el factor actual

Sin argumentos, la función devuelve el factor de crecimiento actual:

use GC

var factorActual = GC.factor()
println("Factor de crecimiento: ", factorActual)

Modificar el factor de crecimiento

Con un argumento numérico (entero o flotante), establece el nuevo factor de crecimiento:

use GC

GC.factor(2.0) // Establece el factor de crecimiento a 2.0
ParámetroTipoDescripción
nuevoFactorinteger o floatEl nuevo factor de crecimiento del heap (opcional)
Valor de retornoDescripción
floatEl factor de crecimiento actual (si no se pasa argumento)
trueSi se estableció correctamente el nuevo factor
Consejo

El factor de crecimiento determina cuánto crece el heap cuando se necesita más memoria. Un factor más alto significa menos recolecciones pero más uso de memoria, mientras que un factor más bajo significa recolecciones más frecuentes pero menos uso de memoria.

Ejemplo completo

use GC

// Mostrar estado inicial
println("GC habilitado: ", GC.isEnable())
println("Factor de crecimiento: ", GC.factor())

// Deshabilitar GC para operación intensiva
GC.disable()

// Realizar operaciones que crean muchos objetos temporales
for (var i = 0; i < 1000; i++)
var temp = "Cadena temporal " + i.toString()
end

// Ejecutar recolección manual
var liberados = GC.collect()
println("Bytes liberados: ", liberados)

// Rehabilitar el GC
GC.enable()

// Ajustar el factor de crecimiento para dispositivos con poca memoria
GC.factor(1.5)