Java algoritmo de recolección de basura en el detallado

I. Introducción

  Hace algún tiempo, por lo general tuvo en cuenta "la comprensión en profundidad de la máquina virtual de Java," este libro, tienen una cierta comprensión de la base de conocimientos relevantes, listo para escribir sobre JVMblog de la familia, este es el segundo. Este blog sólo para hablar sobre el JVMuso que el algoritmo de recolección de basura.


En segundo lugar, el texto

 2.1 ¿Qué es la recolección de basura

  Antes de que el algoritmo formal de recolección de basura presentación, en primer lugar es que lo que es la recolección de basura. Aquí los desechos se refiere principalmente al objeto ya no ha seguir utilizando, por supuesto, puede haber otro, tal como no más tiempo en clases de uso y constantes, sino que se refiere principalmente al objeto, por lo que el siguiente algoritmo introducirá el tema a la colección. Así que la recolección de basura es el significado: el objeto de memoria no se ha utilizado (o clases) y las constantes claras, liberar espacio en la memoria .

  JVMEl modelo de memoria dividida en cinco partes, en el que la memoria de pila única finalidad es la de almacenar un objeto, el objeto se almacena básicamente en la memoria de pila de. Pila, con el fin de facilitar la recogida de basura, la memoria se divide generalmente en dos partes:

  • Nueva Generación : se utiliza para almacenar el corto ciclo de vida de un objeto. Desde esta pieza de objetos de memoria en un tiempo de supervivencia más corta, la recogida de basura de manera frecuente, y cada uno de reciclaje en general puede liberar grandes cantidades de espacio;
  • Año Viejo : se utiliza para almacenar largo ciclo de vida del objeto. La nueva generación sobrevivió objetos más largos se migran aquí (por supuesto, no es el único objeto entra años este método), ciclo de vida del objeto, de manera que aquí se almacena generalmente más largo, por lo que la frecuencia de la recolección de basura en el área de éste suceda bajar, lanzado menos espacio;

  La siguiente discusión se inició JVMalgoritmo de recolección de basura.


 2.2 Cómo identificar el spam

  El primer paso es encontrar la basura recogida de basura (estamos aquí principalmente al objeto, por ejemplo), es decir, los objetos no se pueden utilizar. Los objetos no se pueden usar en qué circunstancias? Muy simple, no hay referencias al objeto, como es natural, no podemos utilizar, por ejemplo, ver el siguiente código:

public static void main(String[] args) throws InterruptedException {
    Object a = new Object();
    a = null;
}

  El código anterior, que crea un objeto y las variables de uso aa punto para este objeto, pero después de eso, gire a la nullasignada a la a, lo que será? No es difícil de encontrar, no hemos sido capaces de utilizar este objeto, y se ha perdido, porque hemos sido incapaces de llamar al objeto mediante cualquier variable, pero todavía está en la memoria. En este caso, la memoria ocupada por el objeto es un desperdicio de recursos, queremos que se solucione. Así, podemos pensar, cuando un objeto es no hay más referencias a él, se puede pensar que es un objetivo de la basura.

(1) de recuento de referencia

  recuento de referencia es innecesaria para identificar el objeto mediante referencia. Registramos el número de cada referencia a un objeto, si los objetos una nueva referencia de variable, el número de referencia del objeto más 1; Si un fallo de referencia, el número de referencia menos 1, y el número de referencia del objeto 0 puede ser reciclado de basura. Aquí hay que señalar que si las variables miembro de estos objetos de basura referencias a otros objetos, el objeto se libera cuando la basura, es natural que una referencia en el fracaso.

  Este algoritmo es simple, de alta eficiencia, sin embargo, no ha sido utilizado en la corriente principal Javade la máquina virtual, ya que tiene un gran inconveniente - es difícil de resolver la referencia circular problema. ¿Qué es una referencia circular, mirada en el siguiente fragmento de código:

public class Main {
    
    private Object obj;
    
    public static void main(String[] args) {
        Main m1 = new Main();
        Main m2 = new Main();

        // 循环引用
        m1.obj = m2;
        m2.obj = m1;

        m1 = null;
        m2 = null;
    }
}

  El código anterior, crear dos objetos m1, y m2que tiene una propiedad obj. Y m1la objseñaló m2, y m2la objpunta m1. La formación de una pluralidad de anillos de referencia, que es una referencia circular. Este colector de basura para el algoritmo de recuento uso de referencia es un problema en que el código de seguridad última, m1y m2se establecen en NULL, apuntan a dos objetos ya no se pueden utilizar, pero desde que los dos objetos se refieren a la otra, lo que resulta en su recuento de referencia es no 0, el recolector de basura no los discrimina objeto inútil. Es a causa de la existencia de este problema, Javael recolector de basura, básicamente, no utilice este algoritmo.

(2) el análisis de alcanzabilidad

  El análisis de accesibilidad es Javael principal método de objetos inútiles discriminación recolección de basura. Los pasos de este método es que, a partir del objeto de raíz, uso DFSo BFSalgoritmo, atravesando a lo largo de la referencia recursiva, y no pueden ser atravesados al objeto, ya no se está utilizando el objeto, que puede ser basura recogida. El llamado raíz, es una variable de tipo de referencia, ya que podemos utilizar directamente:

  • Los parámetros del método o variables locales;
  • Los miembros estáticos o miembro estático de la clase;
  • Constantes en el código;

  La eficacia de este método con respecto a la cuenta de referencia es relativamente complicado, y menos eficiente, pero resolver el problema de la referencia circular, es Javaun método utilizado principalmente en la recolección de basura.


 Cómo rechazar la liberación 2.3

  liberación de basura se refiere a eliminar objetos no deseados, liberar el espacio de memoria ocupado por ellos, para facilitar el uso continuado. Esto introduce tres maneras:

  • Marcar - algoritmo de barrido;
  • algoritmo de replicación;
  • Marcar - Algoritmo de clasificación;

  Tres algoritmos dependiendo de las circunstancias específicas, con el uso de el fin de reproducir los mejores resultados. Aquí es introducir uno por uno.


(1) La marca - algoritmo de barrido (Mark-Sweep)

  Marcos - barrido es más que el anterior tres algoritmos en el tipo más básico, por qué es el más básico, ya que su principio es muy simple. Nombre italiano sugiere, este algoritmo se divide en dos etapas: (1) marcadores; (2) borrar.

  • Marcos : Marcos se refiere a lo que hemos dicho más arriba el análisis de accesibilidad, utilizando dicho algoritmo de análisis antes de accesibilidad transversal del objeto, todos los objetos inalcanzables serán marcados como correo no deseado, espera para la recuperación;
  • Claro : Este paso es muy simple, la liberación directa de la basura objetos de espacio de memoria compartida;

  Este algoritmo tiene dos problemas:

  1. Baja eficiencia, señalización y limpieza de estos dos pasos son relativamente baja eficiencia, baja eficiencia de separación debido a la necesidad de explorar todo el espacio de memoria ocupado por una memoria objeto por la liberación;
  2. Después de usar esta basura algoritmo, que hará que una gran cantidad de fragmentación de la memoria, puede parecer más memoria restante, pero sin gran espacio contiguo, lo que resulta en un objeto de gran espacio no puede ser asignado, lo que provocó la recolección de basura de nuevo;

  Echemos un vistazo a los efectos de este algoritmo en dos tabla de comparación. Podemos ver en la imagen de abajo, después de la recolección de basura causó una gran cantidad de fragmentación de memoria.


(2) el algoritmo de replicación (copia)

  Con el fin de resolver los problemas de baja eficiencia y la fragmentación de la memoria, se sugirió que un nuevo algoritmo - Algoritmo de replicación. El principio algoritmo es: la memoria se divide en dos zonas de igual tamaño, un almacenamiento de objetos una reserva. Al almacenar el área de destino no puede ser asignado pedazo de espacio para copiar todos los objetos que aún viven en el área reservada para la pieza, y luego dirigir la liberación de toda la memoria actualmente en uso en la región. Como resultado, el objeto está todavía vivo en el área reservada, y objetos de basura han sido liberados. Mientras tanto, el espacio se limpia antes de su uso, se ha convertido en una nueva área reservada, y se convirtió en un espacio antes de utilizar el área reservada, y así el ciclo de la utilización de dos espacios.

  Como hemos mencionado anteriormente, la pila de memoria se divide en la vieja y la nueva generación de. En la nueva generación, cada recolección de basura de tiempo puede liberar grandes cantidades de objetos, sólo unos pocos sobreviven, por lo que sólo una pequeña parte del objeto que va a copiar en un área reservada, lo que también significa que la copia no será demasiado tiempo. Además, la liberación directa de espacio que se utiliza toda la memoria, que la eficiencia de una sección de la liberación debe ser mucho mayor. Al mismo tiempo, el objeto se copia a otra área, se coloca cuidadosamente, por lo que no fragmentación de la memoria, es posible simplemente asignar más espacio. Por lo tanto, la copia algoritmo de eficiencia es mucho mayor que la marca - algoritmo de barrido. El siguiente es un algoritmo gráfico de copia presentación:

  Sin embargo, hay un problema en este caso, el algoritmo de replicación de la zona de memoria se divide en dos partes iguales, sino que también significa que cada uno tiene la mitad del espacio no puede ser utilizado, sería demasiado desperdicia. Por lo tanto, para la división del espacio, la necesidad de hacer algunas mejoras. IBMLa investigación muestra que 98%objects tiempo de supervivencia es muy corto, por lo que no hay necesidad de retener la mitad del espacio para la replicación. En una implementación práctica, el espacio se divide en tres regiones, un mayor Edenespacio, así como dos pequeños Survivorespacios. Al asignar espacio para el nuevo objeto, en primer lugar ser dedicada a un Edenespacio, si Edencuando el espacio ya no es el espacio asignado, dará lugar a la recolección de basura, esta vez, va a Edencopiar objetos vivos en el espacio en el que una Survivory, a continuación, vaciar el espacio Edenespacio. Cuando Edenespacial de nuevo debido a la imposibilidad de asignar espacio para la recolección de basura gatillo, será Edenobjetos vivos en el espacio, y la última vez que se copia en los Survivorobjetos vivos en el espacio, se copian en otro pedazo de Survivorespacio, y luego Edenuna en y Survivorvaciado. Es decir, utilizando alternativamente dos Survivorespacios, el recolector de basura para almacenar el objeto en cualquier supervivencia natural. En una implementación específica, una proporción de estos tres espacios de transporte es 8:1:1, es decir, solamente 10%el espacio no puede ser utilizado.

  Como puede verse, este algoritmo son cortos, la eficiencia es muy alta en la mayor parte del tiempo de vida del objeto, pero si la mayoría de los objetos del ciclo de vida es muy larga, ya no se aplican, por lo que el algoritmo general, sólo se utilizará en la nueva generación . Aquí tenemos que considerar una pregunta, cuando solíamos decir cuando la memoria anterior se divide en tres bloques de esta manera, puede haber un problema: Si después de un cierto recolección de basura tiempo, todavía hay un gran número de objetos para sobrevivir, esta vez una Survivorfalta de espacio para almacenar estos objetos cómo hacerlo? Esta vez tenemos que tener el espacio para hacer otra garantía, y cuando esto sucede, estos objetos serán colocados en otro espacio, ese espacio se llama el espacio de seguridad . Como vamos a los préstamos bancarios, la necesidad de un garante, cuando la gente no puede pagar el préstamo, el garante pagado. algoritmo anterior se utiliza en la nueva generación, el llamado espacio de garantía, de hecho, es la vieja era. En nombre del algoritmo de ancianos proporciona garantías, pero en la mayoría de los casos, Survivorson capaces de satisfacer la demanda.


(3) marca - acabado (Mark-compacto)

  A medida que la vieja era de los objetos son generalmente más largo que el tiempo de supervivencia, no es adecuado para la recolección de basura algoritmo utilizando la copia arriba en la vieja era. Y fue de acuerdo a las características de la vejez, la propuesta de marca - Algoritmo de clasificación, prestar atención a ver aquí es la consolidación , más que el primer algoritmo clara. Este algoritmo también se divide en dos pasos marcar y acabado, marcando el primer paso y el algoritmo es el mismo, la clave está en la etapa de acabado. El llamado de acabado, sigue vivo en la memoria del objeto a mover a un lado, hasta que esos objetos se mueven uno hacia el otro, bien ordenados, y luego directamente a borrar toda la memoria no pertenece a esta parte. Marcos - tipo de beneficio es resolver el problema de la fragmentación de la memoria. La siguiente es una presentación de las cartas que el algoritmo:


(4) algoritmo colección generacional

  algoritmo de recolección generacional no es una idea nueva, sino más bien el uso de los tres algoritmos anteriores. También se mencionó anteriormente, para la comodidad de la recolección de basura, la memoria de almacenamiento dinámico se divide generalmente en la nueva generación y el año de edad en dos partes.

  • Para la nueva generación, este es un tiempo de supervivencia de su área es corta, y cada vez que el recolector de basura puede recuperar la mayor parte de la memoria, que es adecuado para su uso algoritmo de replicación, mientras que los viejos años de espacio como una garantía del algoritmo;
  • Por los viejos tiempos, cada recolector de basura de tiempo sólo se puede liberar una pequeña parte del espacio, el uso del algoritmo de replicación, cada uno tendrá que hacer una gran cantidad de duplicación, pero esta vez la Survivornecesidad de un espacio más grande, por lo que no es adecuado para el algoritmo utiliza la replicación, por lo que el año viejo en general, el uso de la marca - barrido o marca - algoritmo de intercalación;


En tercer lugar, el resumen

  A primera vista JVMel algoritmo de recolección de basura que hacer una descripción más detallada, creo que después de leer esta entrada del blog sería parte de esta comprensión más profunda. Sin embargo, en el análisis final, sólo el contenido de la teoría anterior, a continuación, voy a escribir un blog, por decir algo acerca JVMespecíficamente cómo asignar y liberar los objetos, como una JVMserie de blog de Título III.


En cuarto lugar, la referencia

  • "La comprensión en profundidad de la Máquina Virtual de Java"

Supongo que te gusta

Origin www.cnblogs.com/tuyang1129/p/12508216.html
Recomendado
Clasificación