La recolección de basura (Garbage Collection, GC) en Visual Basic .NET es un proceso automático de gestión de memoria que libera objetos no utilizados, evitando fugas de memoria. Al crear objetos, la memoria se asigna en el montón administrado, y cuando ya no hay referencias al objeto, el recolector de basura libera los recursos ocupados con el tiempo.
Características:
Finalize para limpiar recursos no administrados, pero es más fiable utilizar la interfaz IDisposable y el método Dispose.Using para llamar automáticamente al método Dispose.Ejemplo de código usando Dispose:
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... recurso no administrado Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' Limpieza de recursos disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
¿Se puede tener la seguridad de que el finalizador del objeto será llamado al finalizar el programa?
Respuesta incorrecta: Sí, el finalizador se llama automáticamente cuando el objeto ya no es necesario.
Respuesta correcta: No, la llamada al finalizador no está garantizada al finalizar el proceso. Los finalizadores solo se llamarán si el GC tiene tiempo para procesarlos. Para liberar recursos de manera confiable, siempre utiliza Dispose.
Ejemplo:
' Uso de la construcción Using para garantizar la liberación del recurso Using mgr As New FileManager() ' Trabajo con el recurso End Using
Historia
En un proyecto de procesamiento de archivos, los archivos temporales no se eliminaban, ya que solo se confiaban en el finalizador. Con un gran volumen de archivos, se produjo un desbordamiento del sistema de archivos, hasta que se implementó una llamada explícita aDispose.
Historia
Un desarrollador llamaba manualmente aGC.Collect()después de cada operación, lo que ralentizaba drásticamente el rendimiento de la aplicación, ya que las recolecciones de basura frecuentes consumían mucho CPU.
Historia
En grandes aplicaciones web, uno de los servicios implementó incorrectamente el patrón Dispose y no llamaba aGC.SuppressFinalize(). Esto provocaba una limpieza doble de objetos, lo que causaba fallos inesperados y fugas de recursos.