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.
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.
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.
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ámetro | Tipo | Descripción |
|---|---|---|
nuevoFactor | integer o float | El nuevo factor de crecimiento del heap (opcional) |
| Valor de retorno | Descripción |
|---|---|
float | El factor de crecimiento actual (si no se pasa argumento) |
true | Si se estableció correctamente el nuevo factor |
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)