Una cosa que vale la pena señalar es que, no solo marcar y barrer, sino también copiar y compactar, también son parte crítica del algoritmo GC, en ausencia de lo cual no se puede abordar el rendimiento y la fragmentación.
Dicho esto, la idea de la mortalidad infantil de objetos es muy importante. La mayoría de los objetos mueren jóvenes, lo que significa que el objeto se volverá inalcanzable poco después de que se asigne en el montón o vivirá durante bastante tiempo.
Contrariamente a la creencia popular, el proceso de marcar es encontrar qué objetos necesitan ser guardados en lugar de encontrar cuáles necesitan ser recolectados. Por lo tanto, la fase de marcado es directamente proporcional al conjunto de objetos vivos en el montón. Esto está directamente relacionado con el concepto de mortalidad infantil de objetos. Porque si sabemos que la mayoría de los objetos no son accesibles, ¿por qué molestarse en encontrar cuáles son esos? En cambio, es mejor concentrarse en los que son accesibles. El barrido solo limpiará todos los que no sean parte de este set en vivo. Ahora aquí está el factor decisivo. Si se puede alcanzar muchos objetos en el primer paso, probablemente vivirán mucho tiempo, por lo que sería realmente ineficiente verificar su accesibilidad una y otra vez.
- ¿Cuál es un buen algoritmo para una tabla de clasificación rodante?
- Cómo ordenar diagonales de una matriz 2D de manera eficiente
- ¿Es probable que algún día los algoritmos de aprendizaje automático evolucionen para resolver problemas completos de NP?
- Cómo hacer un programa que imprima potencias de 2 hasta n en C ++
- ¿Hay alguna manera de resolver SPOJ.com - Problema GSS1 sin árboles de segmentos?
Aquí es donde entra en escena el concepto de generación de objetos. Si sabemos que de los objetos jóvenes (asignados recientemente), la mayoría de ellos morirían (creados dentro del contexto de la llamada al método, etc.), el marcado y barrido frecuente se vuelve eficiente e importante en esta generación. Recuerde que marcar y barrer tendrá que hacer menos trabajo porque pocos vivirán (~ set en vivo). Pero los que son retenidos, deben pasar a una generación diferente donde el marcado y el barrido deben ser poco frecuentes porque la mayoría de ellos permanecerán accesibles durante bastante tiempo. Por lo tanto, el algoritmo GC utiliza un concepto de copia para mover esos objetos de larga vida de una generación a otra.
Además, cuando los objetos se asignan una y otra vez en el montón, es probable que ocurra la fragmentación de la memoria. Si la memoria no está disponible en fragmentos continuos, JVM no podrá asignar un conjunto contiguo de memoria a, por ejemplo, una gran matriz. Por lo tanto, es necesario un proceso de compactación para la memoria de la defragmentación.
Estos conceptos de mortalidad infantil elevada de objetos junto con la noción generacional de mantenimiento de reserva de objetos hacen que el proceso de marca-barrido-copia-compacta sea extremadamente útil para el algoritmo GC.