Aburrido JavaEE desde la entrada hasta el abandono (cuatro) mecanismo de recolección de basura (recolección de basura)

Tabla de contenido

1. El principio y el algoritmo de la recolección de basura

1. Gestión de la memoria

2. Proceso de recolección de basura

3. Algoritmos relacionados con la recolección de basura

2. Mecanismo de recolección de basura generacional universal

1. La generación joven

2. Generación mayor

3. Generación permanente

4. Tres GC

Tres. Ajuste de JVM y GC completo

Cuatro. Otros puntos

Cinco. Operaciones que pueden causar pérdidas de memoria en el desarrollo_Resumen del conocimiento de la recolección de basura

1. Crea muchos objetos inútiles

2. El uso de colecciones estáticas

3. Varios objetos de conexión (objeto de flujo I0, objeto de conexión de base de datos, objeto de conexión de red) no están cerrados

4. Uso de oyente


Java introdujo un mecanismo de recolección de basura, que resolvió el problema de administración de memoria más problemático de los programas C ++. Los programadores de Java pueden poner más energía en la lógica empresarial en lugar de en la gestión de la memoria, lo que mejora enormemente la eficiencia del desarrollo.

1. El proceso de recolección de basura generalmente se divide en dos pasos: ¿Cuáles son?

Respuesta: (1) Cómo encontrar basura (2) Reciclaje
2. ¿Cuáles son los dos algoritmos comunes para la recolección de basura?

Respuesta: Método de recuento de referencias, método de referencia alcanzable (algoritmo de búsqueda de raíz) 3. La memoria dinámica
se divide en: generación joven, generación anterior, generación permanente. El recolector de basura se divide en: GC menor, GC mayor, FulIGC ¿A qué áreas corresponden estos tres recolectores de basura?

Respuesta: El GC menor corresponde a la generación joven, el GC mayor corresponde a la generación anterior y el FulIGC corresponde a todos.
4. En el proceso de ajuste de la JVM, una gran parte del trabajo es el ajuste de Full GC. ¿es correcta esta oración?

respuesta.
5. ¿Cuál es el rol de System.gc ()?

Respuesta: Se recomienda iniciar el subproceso de recolección de basura.

 

1. El principio y el algoritmo de la recolección de basura

1. Gestión de la memoria

La gestión de memoria de Java se refiere en gran medida: la gestión de objetos en el montón , incluida la asignación y liberación de espacio de objetos.
La asignación de espacio de objetos: use la nueva palabra clave para crear un objeto.
Liberación de espacio de objetos: Asigne el objeto como nulo. El recolector de basura será responsable de recuperar el espacio de memoria de todos los objetos "inalcanzables".

2. Proceso de recolección de basura

Cualquier tipo de algoritmo de recolección de basura generalmente tiene que hacer dos cosas básicas:
1. Encontrar objetos inútiles
2. Recuperar el espacio de memoria ocupado por objetos inútiles.

El mecanismo de recolección de basura garantiza que los "objetos inútiles" puedan reciclarse. Un objeto inútil significa que ninguna variable se refiere al objeto. El recolector de basura de Java encuentra objetos inútiles a través de algoritmos relacionados, los limpia y los organiza.

3. Algoritmos relacionados con la recolección de basura

1.
Cada objeto del montón del método de recuento de referencias corresponde a un contador de referencia. Cuando hay una referencia a este objeto, el contador de referencia aumenta en 1, y cuando la referencia al objeto deja de ser válida (la referencia se vuelve nula), el el contador de referencia se reduce en 1. Finalmente, si el valor de la calculadora de referencia del objeto es 0, el recolector de basura de Java considerará el objeto como un objeto inútil y lo reciclará. La ventaja es que el algoritmo es simple, pero la desventaja es que los "objetos inútiles referenciados circularmente" no se pueden identificar.

2. El programa del método de accesibilidad de referencia (algoritmo de búsqueda de raíz)
trata todas las relaciones de referencia como un gráfico, comenzando desde un nodo GC ROOT, buscando el nodo de referencia correspondiente, después de encontrar este nodo, continúe buscando el nodo de referencia de este nodo, cuando Después de buscar todos los nodos referenciados, los nodos restantes se consideran nodos no referenciados, es decir, nodos inútiles.

2. Mecanismo de recolección de basura generacional universal

El mecanismo de recolección de basura generacional se basa en el hecho de que el ciclo de vida de diferentes objetos es diferente. Por lo tanto, los
objetos de diferentes ciclos de vida pueden adoptar diferentes algoritmos de reciclaje para mejorar la eficiencia del reciclaje. Dividimos los objetos en tres estados: generación joven, generación anterior y generación permanente. Al mismo tiempo, coloque objetos en diferentes estados en diferentes áreas del montón.
JVM divide la memoria del montón en espacios Eden, Survivor y Tenured / Old. (Eden, Survivor pertenecen a la generación joven, Tenured / Old pertenecen a la generación anterior)

1. La generación joven

Todos los objetos recién generados se colocan primero en el área del Edén. El objetivo de la generación joven es recopilar los objetos con un ciclo de vida corto lo más rápido posible. Esto corresponde a Minor GC. Cada vez que Minor GC limpiará la memoria de la generación joven. El algoritmo utiliza un algoritmo de copia más eficiente y operaciones frecuentes, pero desperdiciará espacio en la memoria. Cuando el área de "generación joven" está llena de objetos, los objetos se almacenan en el área de generación anterior.

2. Generación mayor

Los objetos que sobreviven a las recolecciones de basura N (por defecto 15) en la generación joven se colocarán en la generación anterior. Por tanto, se puede considerar que los objetos almacenados en la vieja generación son objetos de larga duración. Hay cada vez más objetos de generación anterior, necesitamos iniciar Major GC y Full GC (recuperación completa) para limpiar el área de la generación joven y el área de la generación anterior de una manera integral.

3. Generación permanente

Se utiliza para almacenar archivos estáticos, como clases, métodos, etc. de Java La generación persistente no tiene un efecto significativo en la recolección de basura. JDK7 solía ser una implementación de "área de método". No hay una "generación permanente" después de JDK8, use el espacio de metadatos de metadatos y el montón en su lugar.

4. Tres GC

GC menor: se
utiliza para limpiar el área de la generación joven. Cuando el área del Edén esté llena, se activará un GC menor. Limpia objetos inútiles y copia objetos útiles en las áreas "Survivor1" y "Survivor2".
Major GC: se
utiliza para limpiar el área de la vieja generación.
GC completo: se
utiliza para limpiar las regiones jóvenes y mayores. El costo es alto, lo que tendrá un impacto en el rendimiento del sistema.

Tres. Ajuste de JVM y GC completo

En el proceso de ajuste de la JVM, una gran parte del trabajo es el ajuste de Full GC. La GC completa puede deberse a las siguientes razones:
1. La generación titular está completa

2. La permanente (permanente) está llena

3. System.gc () se llama explícitamente

4. Cambios dinámicos en la estrategia de asignación de dominios de Heap después del último GC

Cuatro. Otros puntos

1. El programador no tiene derecho a llamar al recolector de basura.
2. El programador puede llamar a System.gc (), este método es solo para notificar a la JVM, no para ejecutar el recolector de basura. Intente usarlo lo menos posible, solicitará iniciar Full GC, lo cual es costoso y afecta el rendimiento del sistema.
3. El método finalize es un método que Java proporciona a los programadores para liberar objetos o recursos, pero utilícelos lo menos posible.

Cinco. Operaciones que pueden causar pérdidas de memoria en el desarrollo_Resumen del conocimiento de la recolección de basura

En el desarrollo real, el sistema a menudo falla. Debemos prestar atención a estos escenarios de uso para las siguientes operaciones.

Los escenarios que tienen más probabilidades de causar pérdidas de memoria en las siguientes cuatro situaciones:

1. Crea muchos objetos inútiles

Por ejemplo, cuando necesitamos una gran cantidad de cadenas concatenadas, usamos String en lugar de StringBuilder.

p.ej:

String str= "";
for (inti= 0;i < 10000; i++) {

    str += i;//相当于产生了10000个String对象
}

2. El uso de colecciones estáticas

El uso de HashMap, Vector, List, etc. es más propenso a pérdidas de memoria El ciclo de vida de estas variables estáticas es consistente con la aplicación y no todos los objetos pueden ser liberados.

3. Varios objetos de conexión (objeto de flujo I0, objeto de conexión de base de datos, objeto de conexión de red) no están cerrados

Los objetos de conexión, como los objetos de flujo de E / S, los objetos de conexión de la base de datos y los objetos de conexión de red, son conexiones físicas y están conectados al disco duro oa la red. Deben cerrarse cuando no se utilicen.

4. Uso de oyente

Cuando se lanzó el objeto, no se eliminó el oyente correspondiente

 

 

 

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44593822/article/details/115309941
Recomendado
Clasificación