Serie JVM - la comprensión en profundidad de la recolección de basura JVM

prefacio

En la máquina virtual de Java, los objetos Java se cargan en una JVM, su ciclo de vida se divide en siete fases:

Como se muestra arriba, siete etapas del ciclo de vida de los objetos fueron: la etapa de creación, la etapa de aplicación, la etapa no es visible, no hacia arriba fase, fase de recogida, el final de la etapa, y la etapa de reasignación de espacio en memoria de objeto.

  • fase de creación

Para crear un escenario se pueden dividir en:

(1) asignado al espacio de objetos; (2) para construir un objeto; (3) de una superclase para una subclase de la inicialización miembro estático; (4) la recursivo constructor de la clase llamada súper; (5) llama a la subclase constructor;

  • fase de solicitud

Cuando la aplicación se le da el valor inicial inicializado, cambiar a la etapa de aplicación. Este objeto de referencia de fase que tiene al menos un fuerte, suave o explícitas referencias, referencias débiles citados o falsa;

  • etapa invisible

No se puede encontrar el objeto en la aplicación de todas las referencias fuertes, tales como la implementación del programa está fuera del alcance del objeto. Pero esta vez el objetivo sigue siendo probable que ser ocupado por una especial raigambre GC, por ejemplo, son objetos pila método nativo o referencias JNI citados por el hilo conductor y así sucesivamente;

  • etapa inalcanzable

El objeto no es ninguna referencia fuertes citada, y el recolector de basura encontró inalcanzable;

  • fase de recolección

Los recolectores de basura han encontrado que este objetivo es inalcanzable, y el recolector de basura listo para volver a asignar el objeto de memoria. Si descubre el recolector de basura que el objeto anula el finalize()método, el recolector de basura se recogerá la exención del objeto, y llamar al finalize()método. Si el objeto no invalida el finalize()método, esperando a que el recolector de basura recupera el espacio de memoria del objeto.

  • en etapa terminal

En este momento, el objeto puede ser ejecutado finalize()método (GC no necesariamente va a esperar a que finalize del objeto () método realiza End), o el objeto no invalida el finalize()método, este tiempo de espera para el recolector de basura para recoger el espacio de memoria del objeto.

  • Objeto etapa de reasignación de espacio

Cuando los objetos son el espacio de memoria GC recuperados, el ciclo de vida del objeto está completamente terminado.

Por encima, un objeto se carga en el ciclo de vida de la JVM. En la máquina virtual de Java, el objeto de la recuperación no es visible para el programador, lo que significa que una vez que el objeto no es referenciado por otros objetos, se puede marcar como inalcanzable GC, GC y luego esperar a la recuperación. Cuando no se hace referencia al objeto de recuperación de la máquina virtual de Java, se someten a la marca de destino, y el objeto es el proceso de reciclaje el recolector de basura.

Garbage algoritmo de marcado

En la máquina virtual Java, objetos de basura (cuando un objeto no está en manos de otros objetos cuando los objetos son conocidos como spam) marcar algoritmo se pueden dividir en las referencias de conteo y análisis de alcanzabilidad (también parte del artículo accesibilidad el análisis conocido como el algoritmo de búsqueda de la raíz).

recuento de referencias

En el "comprensión en profundidad de Java Virtual Machine", un libro, definir un método de recuento de referencia da: la adición de una referencia al contador de objetos en su lugar cuando una referencia a él, el valor de referencia del contador se incrementa en 1; cuando se refiere a la insuficiencia cuando el valor del contador se reduce en 1; ya no está siendo utilizado objeto de contador 0 cualquier momento. Sin embargo, en la actual corriente mayoritaria máquinas virtuales comerciales no están utilizando el método de recuento de referencia, ya que es muy difícil resolver el problema de las referencias mutuas entre los objetos, el código siguiente:

algoritmo de recuento de referencias demostrar _1

algoritmo de recuento de referencias demostrar _2

Como el código, cuando se ejecuta

TestReferenceCountingGC gc_1 = new TestReferenceCountingGC();
TestReferenceCountingGC gc_2 = new TestReferenceCountingGC();

gc_1.instance = gc_2;
gc_2.instance = gc_1;
复制代码

Cuando, debido new TestReferenceCountingGC()y new TestReferenceCountingGC()dos objetos está referenciado dos veces, si de acuerdo con referencia al algoritmo de recuento, new TestReferenceCountingGC()y new TestReferenceCountingGC()el valor del contador se hace referencia a 2. Cuando se ejecuta gc_1 = null;, y gc_2 = null;cuando, habrá 1 citas falla, new TestReferenceCountingGC()y new TestReferenceCountingGC()hay referencias 1, por lo que si la máquina virtual Java utiliza un recuento de referencias objetos marcas algoritmo de basura, el espacio de memoria de los dos objetos no son recolector de basura recuperaron, registros de GC debe aparecer como sigue:

[GC (System.gc()) [PSYoungGen: 9339K->4872K(76288K)] 9339K->4880K(251392K), 0.0057164 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
复制代码

En la práctica, sin embargo, hubo un registro de GC de la siguiente manera:

[GC (System.gc()) [PSYoungGen: 9339K->776K(76288K)] 9339K->784K(251392K), 0.0015327 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
复制代码

GC registra por encima de la marca algoritmo de máquina virtual de Java, no utilizando el algoritmo de recuento de referencias de basura a prueba actual.

El análisis de accesibilidad

La idea principal de análisis de alcanzabilidad es a través de una serie de objetos llamados Roots GC como punto de partida, a continuación, buscar hacia abajo desde este nodo, llamado la ruta de búsqueda atravesada por la cadena de referencias (cadena de referencia). Cuando un objeto a Roots GC sin ninguna referencia a la cadena asociada (en la teoría de grafos, es decir, de las raíces de GC a este objeto es inalcanzable), entonces no utilice el tiempo para demostrar este objeto.

En Java, se puede tener la siguiente (en parte) como una raíz GC son:

  • pila de la máquina virtual (marco de pila tabla de variables locales) en la referencia de objeto;
  • atributo de objeto hace referencia a la zona de proceso estático;
  • El área clave final método modificado constantes referencias a objetos;
  • método nativo JNI apila objeto referenciado;

En JDK 1.2 antes de definición referenciada: la tabla de variables locales en el valor de referencia de la máquina virtual pila representa tipos de datos almacenados es la dirección de inicio de otra memoria, esto se llama una memoria de referencia representa. Sin embargo, este argumento sólo se puede utilizar para definir la definición que se hace referencia y no se hace referencia a estos dos estados. Para ser capaz de describir la clase un ejemplo de objetos: Cuando la memoria es suficiente, se retiene en la memoria, si el espacio de memoria durante la recolección de basura, la huella de la memoria sigue siendo muy ajustado, puede recuperar estos objetos.

Por lo tanto, las referencias hechas fuerte (Referencia Strong), las referencias blandos (Soft referencia), de referencia débil (Referencia débil), la referencia virtual (Phanton Referencia):

  • Fuerte referencia similar a Object obj = new Object()las referencias de este tipo, siempre que hay una fuerte relación con el recolector de basura nunca recuperar dichos objetos;

  • referencias suaves un debilitamiento relativo de referencias fuertes citó una serie, se puede hacer que los objetos eximen algunos recolección de basura, y sólo cuando la JVM pensar fuera de la memoria, se recuperarán las referencias blandos están apuntando. JVM se asegurará de que antes de tirar OOM, limpiar el objeto que apunta referencia suave;

  • referencias débiles y recolección de basura no se puede renunciar, siempre y cuando el acceso sólo llevando a cabo en el estado débil de la referencia de objeto. Está asociado con un débil referencia a un objeto sólo puede sobrevivir hasta que se produzca la próxima recolección de basura. Cuando el trabajo de recolector de basura, independientemente de la memoria actual es suficiente, sólo recupera los objetos perdidos se asocian con referencias débiles;

  • Fantasma de referencia también se conoce como fantasma o aparición referencias citadas, no se puede acceder a ella a través del objeto. Proporcionar un objeto de referencia fantasma es sólo para asegurar que finalize()el mecanismo más tarde, a hacer ciertas cosas, como por ejemplo un sistema para recibir una notificación cuando el objeto es basura recogida.

algoritmo de recolección de basura

Marcos - algoritmo de barrido

Marcos - algoritmo de barrido se divide en dos etapas:

  • fase de marcado: Objeto de marca se puede recuperar;
  • fases claras: recuperación de la memoria diana marcado;

Marcos - algoritmo de barrido cuando el algoritmo más básico, ya que los algoritmos de recolección de basura se basan en la base de este último se mencionó anteriormente, esta transformación algoritmo, marca - proceso de implementación del algoritmo de barrido es de la siguiente manera:

Marcos - algoritmo de barrido tiene dos inconvenientes principales: primera marca y la eficiencia de barrido no es alto, en segundo lugar Como se muestra anteriormente, reciclable claro después de marcar el espacio objetivo, una gran cantidad de fragmentación de la memoria discreta, la fragmentación demasiado puede dar lugar a seguimiento no es suficiente memoria asignada al objeto más grande, haciendo lugar a una nueva ronda de medidas de recolección de basura.

algoritmo de replicación

Con el fin de resolver los marca - problemas del algoritmo de barrido causados ​​por la fragmentación de la memoria, por lo tanto, proponer un algoritmo de copia. Replicación algoritmo el espacio de memoria se divide en dos partes de igual tamaño, cada uno con sólo uno de ellos, a continuación, poner otro trozo de espacio de memoria salga limpio:

algoritmo de la replicación del problema de la baja eficiencia de la deficiencia de replicación, y no quiere perder el 50% del espacio de memoria, es necesario proporcionar garantías adicionales de espacio en la memoria de respuesta es utilizado por todos los objetos son 100% de supervivencia en casos extremos.

Marcar - Algoritmo de clasificación

Copiar el algoritmo antiguo no se utiliza generalmente en años, ya que en la época antigua, la tasa de supervivencia de la mayoría de los objetos es relativamente alta, hará que el algoritmo replicación excesiva para seleccionar la operación de copia, lo que resulta en una baja eficiencia. Si bien no utilizando la marca - algoritmo de barrido, porque va a producir demasiada fragmentación de la memoria, lo que fácilmente desencadenar una nueva ronda de medidas de recolección de basura. Por lo tanto ha habido una marcada - (- algoritmo de compresión marca) Algoritmo de clasificación. Marcos - Acabado Algoritmo y marca - algoritmos de barrido son diferentes, los objetos en memoria después de las etiquetas, los objetos que sobreviven comprime en un extremo de la memoria, por lo que se clasifican en conjunto compacto y objetos vivos fuera de la frontera del objeto reciclar.

colección generacional

algoritmo de recolección generacional en conjunto con una variedad de diferentes algoritmos para manejar diferentes espacio de la basura, por lo que antes de aprender generacional algoritmo de recolección de primera necesidad de comprender el montón de Java división espacial. montón de Java se divide en una nueva generación (generación joven) y el año de edad (Titular generación), mientras que la nueva generación se subdivide en el espacio Edén, Desde el espacio sobreviviente sobreviviente y el espacio. Porque dentro montón de Java, la mayor parte de los objetos "nacen hacia el fuera de noche", y sólo unos pocos del ciclo de vida del objeto es relativamente largo, e incluso algunos ciclo de ciclo de vida y la vida objeto de la máquina virtual, siempre y cuando, el uso de diferentes objetos del Ciclo de Vida diferentes algoritmos de recolección de basura, que es el concepto de recolección generacional.

De acuerdo con la división del espacio del montón de Java, la mayor parte de la recolección de basura se pueden dividir en dos métodos:

  • Menor GC: la nueva colección de la generación de basura;
  • GC completo: también conocido como Major GC, GC completa suele ir acompañado de al menos un menor GC, su baja frecuencia de recogida, tarda mucho tiempo.

Al realizar un GC Minor cuando la máquina virtual para copiar el espacio Edén se opone a sobrevivir en el espacio Para sobreviviente, mientras que el sobreviviente de los objetos espaciales superviviente también se copian en el espacio Para sobreviviente, entonces el espacio y luego Eden Desde el espacio sobreviviente dentro de todos Borrar objetos, esta vez el espacio puntero que apunta a sobreviviente de espacio sobreviviente, que el nombre se convierte en un espacio de sobreviviente de espacio sobreviviente que esperar a la próxima GC Minor por venir. Por supuesto, no todos los nuevos objetos se asignan en el espacio del Edén, cuando un nuevo objeto necesita ocupar espacio en memoria que el espacio disponible en el espacio Edén es mucho más grande, el nuevo objeto se asignará directamente en la vieja era.

Cuando el objeto está todavía vivo después de la nueva generación a través de un cierto número de GC Minor, la máquina virtual se puso el objeto fue ascendido a la vieja era. máquina virtual para cada objeto define un contador de edad objetivo (edad). Cuando un nuevo objeto en el espacio a través de un menor GC Eden sigue vivo y puede ser aceptada espacio sobreviviente, llevó al contador de edad se establece en 1, entonces cada uno de los objetos a través de un Gc Menor, poner la edad del contador de objetos se incrementa en uno, cuando objeto de contador de edad para alcanzar el umbral de la vejez, cuando se promovió, el objeto será promovido a la vieja era, la máquina virtual en general se establece en 15.

Por supuesto, la máquina virtual no necesariamente tiene que apuntar el valor de contador de edad ha alcanzado el umbral de la vejez de una promoción a otra del objeto. Si la suma de un mismo espacio edad sobreviviente de todos los objetos de más de la mitad del tamaño del espacio sobreviviente, mayor de edad igual o superior a la edad del sujeto puede entrar en años, y sin tener que esperar hasta que el valor del contador al umbral de promoción edad se reúnen vejez.

resumen

También tenía la intención de estrategias de recuperación de asignación de memoria y, análisis de registros GC también escrito aquí, pero este capítulo espacio Miaole Miao, sintiendo una longitud excesiva poco, ja, ja ... que .... Yo no lo escribo .

Supongo que te gusta

Origin juejin.im/post/5e81e0075188257382097586
Recomendado
Clasificación