2011-10-27 17 views
5

Gen 0: Entonces leo que gen 0 se dispara cuando gen 0 excede un umbral de tamaño. Pero también leí que GC no se realiza en una "nueva", porque "nuevo" simplemente desliza una dirección hacia adelante. Entonces, ¿cuándo verifica que ha excedido el umbral para activar el gen 0 GC?¿Cuándo se activa gen 0, gen 1, gen 2 exactamente?

Gen 1/2: ¿Gen gen 1/2 tiene su propio umbral de tamaño que activa el GC? ¿Cuándo consideran el umbral? ¿Es el momento en que los sobrevivientes son promovidos al gen?

¿Eso significa que se produce un gen 1 GC primero comprueba gen 0, luego los promueve al gen 1, solo para encontrar que gen 1 ha excedido el umbral y así comprobar gen 1, y comprobar gen 0 de nuevo?

Y significa que para que se produzca un gen 2 GC primero comprueba gen 0, luego los promueve al gen 1, solo para encontrar que gen 1 ha excedido el umbral y por lo tanto comprueba gen 1 y comprueba gen 0 nuevamente. Luego promueve gen 0 a gen 1 y gen 1 a gen 2, solo para encontrar que gen 2 ha excedido el umbral y por lo tanto comprueba gen 2, gen 1 nuevamente, y gen 0 nuevamente?

+4

Todos estos detalles son detalles de implementación internos patentados, varían de implementación a implementación y están sujetos a cambios en cualquier momento. Además, el GC se ejecuta en su propio hilo, por lo que la programación de hilos también es un factor. Si pudieras decir por qué te importa, eso te ayudaría a obtener una mejor respuesta. Si le importa, por ejemplo, porque quiere saber cuándo corre el riesgo de que se produzca una colección costosa en un mal momento, hay formas de averiguarlo * sin * conocer los detalles internos del GC. –

+0

Me importa porque tengo que explicárselo a personas que no conocen la GC por completo y descubrí que simplemente conozco el efecto, pero no sé la causa. Tampoco sé cuáles son los detalles de implementación y cuáles son tales que no tengo que explicarlos. –

+1

Si le preocupa cuándo se inicia el GC, lo está haciendo mal. – leppie

Respuesta

0

Gen 0 se activa cuando la VM está sin memoria.
Gen 1 se activa cuando Gen 0 no libera suficiente memoria y todavía está sin memoria.
Gen n se dispara cuando Gen n - 1 no libera suficiente memoria y todavía está sin memoria.
Si alcanza la última generación y todavía no libera suficiente memoria, se asigna nueva memoria.

+0

¿Quiere decir que es cierto que para que se produzca un gen 2 GC primero comprueba gen 0, luego los promueve al gen 1, solo para encontrar que gen 1 ha excedido el umbral y por lo tanto comprueba gen 1 y comprueba gen 0 nuevamente. Luego promueve gen 0 a gen 1 y gen 1 a gen 2, solo para encontrar que gen 2 ha excedido el umbral y por lo tanto comprueba gen 2, gen 1 nuevamente, y gen 0 nuevamente? –

+0

Todo se promociona después de que la memoria ya está bien y sin importar si una colección es exitosa. Después de ir a gen 1 y la colección no es exitosa, irá a gen2, no a atrás. – Dani

1

Después de inicializar CLR, los objetos que se agregan primero al montón administrado se definen como Gen0. Cuando se ejecuta el GC, la generación de los objetos que no se recogieron aumentará en 1 nivel y se convertirá en Gen1. Los objetos creados después de eso siguen siendo Gen0. Con los objetos creados, solo si la memoria liberada por los objetos Gen0 no es suficiente para crear nuevos objetos, y el volumen en Gen1 excede la capacidad, GC recogerá los objetos Gen0 y Gen1. Después de eso, los objetos que no se hayan recopilado en Gen1 se convertirán en Gen2, y los objetos que no se hayan recopilado en Gen0 se convertirán en Gen1. Los objetos creados después de eso siguen siendo Gen0.

Cuestiones relacionadas