2012-05-14 11 views
16

Entiendo que en Java, si un objeto ya no tiene ninguna referencia, el recolector de basura lo reclamará de nuevo más tarde.java - ¿Cómo puede Garbage Collector saber rápidamente qué objetos ya no tienen referencias?

Pero, ¿cómo sabe el recolector de basura que un objeto tiene o no referencias asociadas a él?

¿El recolector de basura usa algún tipo de hashmap o tabla?


Editar:

Tenga en cuenta que no estoy preguntando cómo funciona generalmente GC. Realmente, no estoy preguntando eso.

Estoy preguntando específicamente que Cómo sabe qué objetos están activos y cuáles están muertos, con eficiencias.

Es por eso que digo en mi pregunta que es gc mantener algún tipo de hashmap o conjunto, y actualizar constantemente el número de referencias que tiene un objeto?

+1

posible duplicado de [Teoría y algoritmo detrás de la recolección de basura de Java] (http://stackoverflow.com/questions/4141237/theory-and-algorithm-behind-java-garbage-collection) –

+0

@ ErnestFriedman-Hill no esta pregunta no es un duplicado para http://stackoverflow.com/questions/4141237/theory-and-algorithm-behind-java-garbage-collection No estoy preguntando la teoría subyacente para la recolección de basura. En su lugar, estoy preguntando específicamente acerca de cómo puede el recolector de basura administrar la cantidad de referencias que un objeto tiene actualmente para que luego el recolector pueda decidir si volver a reclamarlo o no. –

+0

Eso es precisamente "la teoría subyacente para la recolección de basura". –

Respuesta

9

Una JVM moderna típica utiliza varios tipos diferentes de recolectores de basura.

Un tipo que se utiliza a menudo para objetos que han existido por un tiempo se llama Mark-and-Sweep. Básicamente implica partir de objetos "vivos" conocidos (las llamadas raíces de recolección de basura ), seguir todas las cadenas de referencias a objetos y marcar cada objeto alcanzable como "en vivo".

Una vez hecho esto, la etapa de barrido puede reclamar aquellos objetos que no se hayan marcado como "en vivo".

Para que este proceso funcione, la JVM debe conocer la ubicación en la memoria de cada objeto de referencia. Esta es una condición necesaria para que un recolector de basura sea precise (que es Java).

+0

¿Quiere decir que cada vez que gc realiza una limpieza, escaneará todos los objetos en memeory (siguiendo el proceso de Marcar y Barrido)? ¿Eso es eficiente? –

+1

¿Eficiente comparado con qué? – NPE

+0

Quiero decir, si tengo millones de objetos en la memoria, haré una imagen cada vez que un escaneo completo podría no ser eficiente. –

2

GC sabrá que el objeto puede eliminarse tan rápido como sea posible. No se espera que administres este proceso.

Pero puede pedirle a GC que se ejecute educadamente con System.gc(). Es solo un consejo para el sistema. GC no tiene que ejecutarse en ese momento, no tiene que eliminar su objeto específico, etc. Porque GC es el GRAN jefe y nosotros (los programadores de Java) somos sus esclavos ... :(

+2

+1 al reinado de GC. The Garbage Chucknorris solo recibe problemas pero nunca acepta pedidos. Es como solicitar un servicio y obtener una respuesta cada vez que el servidor lo decida. – Gamb

4

Java tiene una variedad de las diferentes estrategias de recolección de basura, pero todos ellos trabajan básicamente por no perder de vista que los objetos son alcanzable de los objetos activos conocidos.

Un gran resumen se puede encontrar en el artículo How Garbage Collection works in Java pero para el verdadero baja hacia abajo, usted debe buscar en Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine

Un objeto se considera basura n ya no se puede acceder desde ningún puntero en el programa en ejecución. Los algoritmos de recolección de basura más sencillos simplemente iteran sobre cada objeto alcanzable. Cualquier objeto sobrante se considera basura. El tiempo que toma este enfoque es proporcional al número de objetos activos, lo que es prohibitivo para aplicaciones grandes que mantienen muchos datos en vivo.

A partir de la plataforma J2SE versión 1.2, la máquina virtual incorporó una serie de diferentes algoritmos de recolección de elementos no utilizados que se combinan mediante la recolección generacional. Mientras que la recolección de basura ingenua examina cada objeto vivo en el montón, la colección generacional explota varias propiedades observadas empíricamente de la mayoría de las aplicaciones para evitar trabajo adicional.

La más importante de estas propiedades observadas es la mortalidad infantil. ...

I.e. muchos objetos, como los iteradores, solo viven durante un tiempo muy corto, por lo que es más probable que objetos más jóvenes sean elegibles para la recolección de basura que objetos mucho más antiguos.

Para más hasta guías de ajuste de la fecha, echar un vistazo a:

Por cierto, tenga cuidado de tratar de adivinar cuál sería su basura estrategia de recopilación, he conocido muchos programas de rendimiento para ser destruidos por el uso celoso de System.gc() o las opciones -XX inapropiadas.

Cuestiones relacionadas