2010-11-05 24 views
18

Me he tenido que escribir recientemente un código VBA y me preguntaba si alguien alguna vez 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 pizca de detalles en el VBA GC, aparte de que vagamente menciona que es un contador de referencia. Supongo que es bastante similar al VB6 GC, pero tampoco puede encontrar información sobre eso.VBA Recolector de basura Detalles

Específicamente, estaría interesado en saber: (? Es recogida generacional, por ejemplo)

  • Qué desencadena un GC
  • Qué algoritmo que utiliza
  • Cómo (en su caso) hace maneja referencias circulares?
  • ¿Hay alguna manera de vigilar su funcionamiento

Esto es más por curiosidad que por cualquier necesidad particular de saber, alguna idea en absoluto muy apreciada!

+2

La respuesta de Konrad es todo lo que necesita, pero también le indicaré la Guía del programador de VB, específicamente la sección sobre "Modelos de objetos", que analiza el recuento de referencias, "métodos tearDown" y similares: http: // msdn.microsoft.com/en-us/library/aa263491(v=VS.60).aspx – jtolle

Respuesta

14

Lo siguiente supone que VBA es todavía utilizando el mismo mecanismo de recolección de basura utilizado en VB6 (que es muy probable que lo haga).

VB6 utilizó un GC de recuento de referencias. El GC se activa de manera determinista cuando la última referencia a un objeto determinado se establece en Nothing. No es necesario establecer referencias locales en Nothing, esto sucede cuando salen del alcance.

Cada objeto implementa una interfaz COM que se encarga de la cuenta 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 se disminuye, y el contador del nuevo objeto se incrementa). Un objeto es basura recolectada cuando su contador de referencia alcanza 0.

Por lo tanto, los objetos en referencias circulares nunca se recopilan durante la vida útil de una aplicación VBA. Además, VBA no ofrece una forma de romper referencias circulares. En VB6, las referencias débiles podrían implementarse mediante las funciones de WinAPI.

+1

"Establecer las referencias locales a Nothing no es necesario, esto sucede a medida que salen del alcance". <- ¡Esto debe tatuarse dentro de cada uno de los párpados del desarrollador VBA/VB6! – Lunatik

+0

@Lunatik - ¡De acuerdo! La cantidad de publicaciones que encontré al buscar información de GC que dice "Es una buena práctica establecer referencias a nada" es realmente aterradora. –

+5

@Jon: lamentablemente, este rumor no es del todo infundado. VB6 parecía tener un error que podría causar algunas referencias pendientes en las variables de los miembros de la clase (aunque no las variables locales). No sé si alguna vez se rastreó la fuente exacta de este error, pero se convirtió en una mejor práctica establecida utilizar el método 'Class_Terminate' para configurar todos los miembros en' Nothing'. –

Cuestiones relacionadas