teléfono - Detalles del recolector de basura VBA
servicio de recolección de basura (1)
Lo siguiente asume que VBA sigue utilizando el mismo mecanismo de recolección de basura que se usa en VB6 (lo que probablemente hace).
VB6 utilizó un GC de recuento de referencia. El GC se activa de manera determinista cuando la última referencia a un objeto determinado se establece en Nothing
. Establecer referencias locales a Nothing
es innecesario, esto sucede cuando están fuera del alcance.
Cada objeto implementa una interfaz COM que se ocupa del recuento de referencia para ese objeto. Cada asignación de una referencia de objeto actualiza los contadores de referencia de las referencias involucradas (es decir, el contador del objeto antiguo al que se hizo referencia anteriormente disminuye) y el contador del nuevo objeto se incrementa). Un objeto se recolecta como basura cuando su contador de referencia llega a 0.
Los objetos en referencias circulares nunca se recolectan durante la vida útil de una aplicación VBA. Además, VBA no ofrece una manera de romper referencias circulares. En VB6, las referencias débiles podrían implementarse a través de las funciones de WinAPI.
Me he encontrado con que escribir un código VBA recientemente y me preguntaba si alguien había encontrado algún detalle sobre cómo funciona el recolector de basura VBA. El .Net GC está muy bien documentado, pero no puedo encontrar ni una sola pieza de detalles en el VBA GC, aparte de las vagas afirmaciones de que es un contador de referencia. Supongo que es bastante similar al VB6 GC pero tampoco puedo encontrar ninguna información al respecto.
Específicamente, estaría interesado en saber:
- Lo que dispara un GC
- ¿Qué algoritmo utiliza (es la colección generacional, por ejemplo?)
- ¿Cómo (si es que lo hace) maneja referencias circulares?
- ¿Hay alguna forma de monitorear su funcionamiento?
Esto es más por curiosidad que cualquier necesidad particular de saber, ¡cualquier idea es muy apreciada!