La asignación y la liberación de la memoria en Java y C# se administran automáticamente en máquinas virtuales. Anteriormente he introducido el método de reciclaje de objetos GC en CLR, que es una estrategia de reciclaje de memoria basada en generación. De hecho, en Java, la estrategia de reciclaje de objetos JVM también se basa en la idea de la división generacional. El propósito de esto es aumentar la basura
El rendimiento del reciclaje evita la demora en la respuesta del programa causada por la verificación de todos los objetos en el montón, porque cuando JVM ejecuta GC, detiene la palabra, es decir, termina el funcionamiento de otros hilos y solo restaura las operaciones de otros hilos después de que se complete el reciclaje. La idea basada en la división generacional es: JVM solo necesita una pequeña parte de la memoria cada vez que ejecuta el recolector de basura.
Se verifican las referencias de objetos, y este pequeño número de objetos tiene un ciclo de vida más corto, lo que acelera el rendimiento de la recolección de basura. A continuación presentaremos las estrategias básicas de los algoritmos de recuperación de memoria basados en generación en Java en el futuro:
1. División de generación de la memoria del montón JVM
En una estrategia de recuperación de memoria basada en la generación, el espacio del montón generalmente se divide en 3 generaciones, generación joven, generación antigua (o generación titular) y generación permanente. Entre la generación joven, hay tres áreas pequeñas: Eden, S0 y S1, como se muestra en la figura a continuación:
Entre ellos, los nuevos objetos siempre se asignan a la generación de edad. Cuando se llena el espacio de la generación joven, se debe realizar una recolección de basura, es decir, se ejecuta GC menor, para reciclar los objetos a los que ya no se hace referencia y, al mismo tiempo, aumenta la edad de los objetos sobrevivientes. Los objetos sobrevivientes en la generación de edad tienen un campo de identificación de edad. Una vez que alcancen un cierto umbral, los objetos aún sobrevivientes serán promovidos al espacio de la generación anterior.
El espacio de la antigua generación se usa para almacenar objetos que han sobrevivido durante mucho tiempo, es decir, objetos con un ciclo de vida largo. Una vez que los objetos sobrevivientes en el espacio de generación joven alcanzan un cierto umbral de edad, se promovirá automáticamente a la antigua generación. Cuando el espacio de la antigua generación se llena con objetos, GC se ejecutará una vez. En comparación con GC menor, el número de ejecuciones de GC mayor es mucho menor que el de GC menor. Al mismo tiempo, el mayor GC se ejecuta más tiempo que el GC menor. Porque implica más escaneo de objetos. Esta idea generacional también se basa en la mejor opción en la práctica de que en la práctica, los objetos recientemente asignados tienen un ciclo de vida más corto y los objetos de edad avanzada tienen un ciclo de vida más largo.
Al mismo tiempo, cuando el GC menor y el GC mayor realizan recolección de basura, detienen el evento mundial, es decir, terminan los hilos de ejecución y restauran todos los hilos cuando se ejecuta el GC.
Para la memoria de generación permanente, se utiliza principalmente para almacenar información relevante de metadatos, información de clases y métodos. Cuando una clase ya no esté en uso, se reciclará. Cuando se ejecuta GC completo, la memoria de generación permanente se escaneará para la recolección de basura.
2. Proceso de procesamiento de la recolección de basura basada en generación
Primero, al principio, el nuevo objeto se asigna al área de Eden, S0 y S1 están vacíos. Cuando se llene el espacio en el Edén, realice un GC menor una vez. El recolector de basura moverá el objeto referenciado al área S0, y se eliminarán los objetos a los que ya no se hace referencia. Al mismo tiempo, la edad del objeto sobreviviente es 1. Después de identificar GC, las áreas Eden y S1 están vacías como se muestra en la figura a continuación.
La próxima vez que se ejecute GC menor, lo mismo que los pasos de ejecución anteriores, la única diferencia es que el objeto referenciado, es decir, el objeto sobreviviente, se trasladará al área S1, y la edad del objeto que sobrevive en el área S0 aumentará en 1 y se convertirá en 2, como se muestra en la figura a continuación.
Cuando se ejecuta nuevamente GC menor, el objeto sobreviviente se moverá al área S0 y agregará 1 a la edad del objeto sobreviviente como se muestra en la figura a continuación
Cuando finalmente se ejecuta el GC menor, se encuentra que el objeto sobreviviente en S1 alcanza 8 (suponiendo que el umbral se establece en 8), y el objeto se promovirá a la memoria de vejez, como se muestra en la figura a continuación.
Z
Cuando el antiguo espacio de montón se llena con objetos, se ejecutará una mayor GC una vez, lo que borrará los objetos de que el montón antiguo ya no se hace referencia, y al mismo tiempo, comprimirá el espacio. Como se muestra en la figura a continuación.
La breve discusión anterior sobre la estrategia de reciclaje de basura en JVM es todo el contenido que comparto con ustedes. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.