[Solo quería agregar más sobre el proceso interno de finalización]
Por lo tanto, crea un objeto y cuando se recoge el objeto, Finalize
se debe llamar al método del objeto . Pero hay más en la finalización que esta simple suposición.
BREVE CONCEPTOS ::
Objetos que NO implementan Finalize
métodos, la memoria se recupera de inmediato, a menos que, por supuesto, ya no sean alcanzables por
código de aplicación
Implementar objetos de Finalize
método, el concepto / Implementación de Application Roots
, Finalization Queue
, Freacheable Queue
viene antes de que puedan ser recuperados.
Cualquier objeto se considera basura si NO es alcanzable por el Código de aplicación
Supongamos que: las clases / objetos A, B, D, G, H NO implementan el Finalize
Método y C, E, F, I, J implementan el Finalize
Método.
Cuando una aplicación crea un nuevo objeto, el nuevo operador asigna la memoria del montón. Si el tipo del objeto contiene un Finalize
método, se coloca un puntero al objeto en la cola de finalización .
por lo tanto, los punteros a los objetos C, E, F, I, J se agregan a la cola de finalización.
La cola de finalización es una estructura de datos interna controlada por el recolector de basura. Cada entrada en la cola apunta a un objeto que debería tener su Finalize
método llamado antes de que la memoria del objeto pueda ser reclamada. La siguiente figura muestra un montón que contiene varios objetos. Algunos de estos objetos son accesibles desde las raíces de la aplicación, y algunos no lo son. Cuando se crearon los objetos C, E, F, I y J, el marco .Net detecta que estos objetos tienen Finalize
métodos y se agregan punteros a estos objetos a la cola de finalización .
Cuando se produce un GC (primera colección), se determina que los objetos B, E, G, H, I y J son basura. Debido a que A, C, D, F todavía son alcanzables por el Código de Aplicación representado a través de las flechas del Cuadro amarillo arriba.
El recolector de basura explora la cola de finalización buscando punteros a estos objetos. Cuando se encuentra un puntero, el puntero se elimina de la cola de finalización y se agrega a la cola alcanzable ("F-alcanzable").
La cola alcanzable es otra estructura de datos interna controlada por el recolector de basura. Cada puntero en la cola alcanzable identifica un objeto que está listo para que se Finalize
llame su método.
Después de la colección (1st Collection), el montón administrado se parece a la figura siguiente. La explicación dada a continuación ::
1.) La memoria ocupada por los objetos B, G y H se ha reclamado de inmediato porque estos objetos no tenían un método de finalización que debiera llamarse .
2.) Sin embargo, la memoria ocupada por los objetos E, I y J no se pudo recuperar porque su Finalize
método aún no se ha llamado.
La llamada al método Finalize se realiza mediante una cola freacheable.
3.) A, C, D, F todavía son alcanzables por el Código de Aplicación representado a través de flechas del recuadro amarillo arriba, por lo que NO se recopilarán en ningún caso
Hay un hilo de ejecución especial dedicado a llamar a los métodos Finalizar. Cuando la cola alcanzable está vacía (que suele ser el caso), este subproceso duerme. Pero cuando aparecen las entradas, este hilo se activa, elimina cada entrada de la cola y llama al método Finalizar de cada objeto. El recolector de basura compacta la memoria recuperable y el subproceso especial de tiempo de ejecución vacía la cola alcanzable , ejecutando el Finalize
método de cada objeto . Entonces, aquí finalmente es cuando se ejecuta su método Finalize
La próxima vez que se invoca el recolector de basura (2da colección), ve que los objetos finalizados son realmente basura, ya que las raíces de la aplicación no lo señalan y la cola freachable ya no lo señala (también está VACÍO), por lo tanto, el la memoria para los objetos (E, I, J) simplemente se recupera de Heap. Vea la figura a continuación y compárela con la figura justo arriba
Lo importante a entender aquí es que se requieren dos GC para recuperar la memoria utilizada por los objetos que requieren finalización . En realidad, incluso se requieren más de dos colecciones, ya que estos objetos pueden promoverse a una generación anterior
NOTA :: La cola alcanzable se considera una raíz al igual que las variables globales y estáticas son raíces. Por lo tanto, si un objeto está en la cola alcanzable, entonces el objeto es accesible y no es basura.
Como última nota, recuerde que la aplicación de depuración es una cosa, Garbage Collection es otra cosa y funciona de manera diferente. Hasta ahora no puede SENTIR la recolección de basura simplemente depurando aplicaciones, más aún si desea investigar Memoria, comience aquí.