2010-02-13 10 views

Respuesta

37

Desde Understanding Garbage Collection in .NET

Generaciones

un recolector de basura generacional recoge los objetos de corta vida más frecuencia que las ya vividas. objetos de corta vida se almacenan en la primera generación, la generación 0. Los objetos de vida más larga se ven empujados a las generaciones mayores, 1 ó 2. El colector de basura trabaja más frecuencia en las generaciones más bajos que en el los más altos.

Cuando se crea un objeto primer lugar, es puesta en generación 0. Cuando el la generación 0 se llena, el recolector de basura se invoca. Los objetos que sobrevivir a la recolección de basura en el primera generación son promovidos a la generación inmediatamente superior, la generación 1. los objetos que sobreviven de la basura recogida en la generación 1 están promovidos al siguiente y el más alto generación, la generación 2 Este algoritmo funciona eficientemente para recolección de basura de objetos, ya que es rápido. Tenga en cuenta que la generación 2 es , la generación más alta que es admitida por el recolector de basura.

Garbage Collection in .NET

Generaciones

Mientras que la asignación de memoria en el montón administrado es rápido, GC sí pueden tardar un tiempo. Con esto en mente se han realizado varias optimizaciones para mejorar el rendimiento. El GC es compatible con el concepto de generaciones, en base a la suposición de que más largo un objeto ha estado en el montón, , el más probable es que allí permanezca . Cuando se asigna un objeto en el montón al que pertenece en la generación 0. Cada colección de basura que sobrevive el objeto aumenta su generación de en 1 (actualmente, la generación admitida más alta de es 2). Obviamente es más rápido que buscar a través, y basura recoger un subconjunto de todos los objetos en la pila, por lo que el GC tiene la opción de recoger únicamente generación 0, 1 ó 2 objetos (o lo que sea combinación se escoge hasta que tenga suficiente memoria). Incluso cuando recolecta solo objetos más jóvenes, el GC también puede determinar si los objetos antiguos tienen referencias a objetos nuevos para asegurar que no ignora inadvertidamente los objetos en uso.

17

Hay una buena descripción en "Pro C# 2008":

  1. Generación 0 identifica un objeto recién creado que nunca se ha marcado para su colección
  2. Generación 1 identifica un objeto que ha sobrevivido a un GC (marcado para la recopilación pero no se eliminó porque había suficiente espacio en el montón)
  3. La Generación 2 identifica un objeto que ha sobrevivido a más de un barrido del GC.
+0

Hola, ¿me puede decir cuándo el coleccionista recoge los objetos? Después de la ejecución de todos los métodos? – Bigeyes

+0

No es apropiado hacer una pregunta como comentario en una pregunta de 7 años. Cada tutorial de Java le dirá que el GC se ejecuta en un hilo separado en el momento que elija. – duffymo

+0

@duffymo y ¿qué tiene que ver el tutorial de Java con la pregunta de Bigeyes? A partir de la pregunta de OP de mi ingeniero, se trata de .net – MaLiN2223

5

Mi primer blog responde a su pregunta: Generations of Garbage Allocation

Adición de la información de enlace:

colector de basura del CLR (GC) es un recolector de basura generacional, también conocido como colector ephermal basura.

Tiene tres generaciones:

Generación 0: Contiene todos los objetos de nueva construcción que nunca se examinó mediante GC.

Generation 1: El CLR, cuando se inicializa, selecciona un tamaño de presupuesto en kb para la generación 0. Si la creación de un objeto hace que la generación 0 supere su presupuesto, se inicia la collección de basura. Los objetos que no se recogen en la Generación 0 se mueven a la Generación 1 y la Generación 0 se vacía. Digamos que el presupuesto de la Generación 0 es igual al tamaño de 5 objetos. Por lo tanto la generación 0 se vería a continuación antes de la creación del objeto 6:

enter image description here

Después de la creación del objeto 6, la asignación de basura se inicia la cual libera los objetos de basura 1, 3 y 5 y se mueve 2 y 4 adyacentes entre otra en la generación 1.

enter image description here

El tamaño del presupuesto de generación 1 también se selecciona por CLR tras la inicialización. Creación de objeto 11 hace que el GC para empezar de nuevo que puede moverse un poco más objetos en generación 1.

enter image description here

Generación 1 se tiene en cuenta para la recolección de basura hasta que alcanza su tamaño del presupuesto para la recolección de basura, lo que mejora el rendimiento de GC.

Generación 2:

lo largo de los varios colección generación 0, 1 generación puede superar su límite de presupuesto que causan GC para recoger la basura de las dos generaciones. En este caso, los sobrevivientes de la generación 1 son promovidos a la generación 2, los sobrevivientes de la generación 0 son promovidos a la generación 1, y la generación 0 está vacía.

Digamos que asigna el objeto 21 porque se ha alcanzado la recolección de basura y el presupuesto de generación 1. enter image description here

Así montón se vería a continuación con el objeto de que sobrevivieron en la generación 1 ascendido a la generación 2.

enter image description here

Así que, básicamente Generación GC asume que los objetos más recientes tienen más probabilidad de recogida.

Sabemos que CLR selecciona los presupuestos para las tres generaciones, pero puede modificarlos ya que GC es un colector autoajustable. Si GC ve que hay muy pocos objetos supervivientes después de recoger la generación 0, podría decidir reducir el presupuesto de la generación 0, para que se haga un trabajo menor. Por otro lado, si GC recoge la generación 0 y ve que hay muchos objetos supervivientes, no se recuperó mucha memoria en la recolección de basura. En este caso, el recolector de basura aumentará el presupuesto de la generación 0. El GC también modifica los presupuestos de la generación 1 y la generación 2 en consecuencia.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ reseña/mensajes de baja calidad/17323312) – 1ac0

+1

Copié el contenido del blog para responder. –

+1

@DeepakMishra gracias por editar su respuesta. Se ve muy bien ahora y el esfuerzo es realmente apreciado. – g00glen00b

Cuestiones relacionadas