¿Por qué en Java, la memoria es liberada por el algoritmo Mark y Sweep y no por ningún otro algoritmo?

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.

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.

Tu premisa es incorrecta; la JVM no prescribe ningún algoritmo GC particular (o incluso ninguno).

De hecho, de acuerdo con Java Garbage Collection Basics, “El recolector de basura Garbage First o G1 está disponible en Java 7 y está diseñado para ser el reemplazo a largo plazo del recolector CMS. El recolector G1 es un bajo paralelo, concurrente e incrementalmente compacto. -pausa recolector de basura que tiene un diseño bastante diferente de los otros recolectores de basura descritos anteriormente “.

More Interesting

En la complejidad temporal de un algoritmo, ¿por qué puede considerarse útil que una operación elemental tome "tiempo unitario"?

¿Qué tipo de trabajo haría un cosmólogo en el CERN?

¿Debería concentrarme en dominar algoritmos y estructuras de datos o desarrollar una buena aplicación? ¿Qué es más necesario a largo plazo?

Cómo crear un algoritmo

¿Cuál es la razón por la cual las compañías gigantes (por ejemplo, Google o Microsoft) hacen preguntas típicas como el árbol de búsqueda binario o el algoritmo tradicional o preguntas como la complejidad del algoritmo? ¿Cuál es el propósito? La mayoría de ellos no se usan en la vida real.

¿Cuál es la diferencia entre programación dinámica y recursividad?

¿Los algoritmos de aprendizaje automático han salido del laboratorio y han pasado a entornos clínicos que involucran pacientes?

Cómo tomar una matriz 1d y convertir la matriz en una matriz 2d en una función c ++ para que la matriz ahora sea 2d en main ()

Cómo calcular dos nodos distantes mínimos a partir de dos conjuntos de nodos en un gráfico

¿Cuál es la forma más eficiente de verificar si un elemento es parte de un conjunto?

¿Cómo diseñaría un algoritmo para clasificar 100 millones de libros y encontrar duplicados funcionales?

¿Existe un algoritmo para encontrar un árbol con una longitud de ruta mínima ponderada para un gráfico conectado genérico?

Quiero aprender estructuras de datos OOP y algoritmos usando PHP. ¿Cuáles son los buenos recursos que usan PHP para enseñar algoritmos?

¿Qué métricas deberían usarse para crear una puntuación de confiabilidad automática para los artículos de Wikipedia?

¿Cuál es la solución a la siguiente relación de recurrencia: [matemáticas] T (n) = 3T (n-1) - 7T (n-2) + 9T (n-3) [/ matemáticas], con las siguientes condiciones iniciales: [ matemática] T (0) = 1 [/ matemática], [matemática] T (1) = 6 [/ matemática], [matemática] T (2) = 7 [/ matemática]. ¿Qué es una expresión para [math] T (n) [/ math] de modo que no haya términos [math] T (i (\ frac {n} {j}) ^ {k}) [/ math] a la derecha ¿lado?