2011-03-16 20 views
10

¿Existe alguna posibilidad de que marque un objeto, en java, para que se recoja como basura la próxima vez que se limpia?Marcado de un objeto que se va a eliminar en el GC

He oído que la configuración del objeto nulo ya no funciona.

+2

Podría dar algunos enlaces o documentación relativa a qué establecer el objeto a 'null' no funcionaría? Por supuesto, establecer '' null' no garantizará que sea ejecutado alguna vez. –

+1

Tan pronto como elimine todas las referencias a un objeto (por ejemplo, estableciendo una referencia a 'null') se volverá * elegible * para la recolección de basura. No se quedará sin memoria antes de recuperar esa memoria (suponiendo que marque la diferencia entre quedarse sin espacio en el montón y no quedarse sin montón). Cuando ese GC realmente sucede depende de la VM. ¿Por qué te preocupa? –

+2

Es una preocupación porque estoy lidiando con una gran cantidad de objetos, que contienen una buena cantidad de datos. La asignación generalmente viene en los 1000 a la vez. – monksy

Respuesta

4

Sé que esta pregunta ha sido respondida, pero hay formas en que puede manipular la forma en que el recopilador de basura de Java examina sus referencias.Puede hacerlo a través de Referencias suaves, Referencias débiles y Referencias fantasmas. Eche un vistazo al paquete java.lang.ref para una mejor explicación.

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ref/package-summary.html

También aquí es una muestra agradable para determinar cuando un PhantomReference está a punto de ser basura recogida.

http://exampledepot.8waytrips.com/egs/java.lang.ref/PhantomRef.html

Este es el sitio principal que venía de:

http://exampledepot.8waytrips.com/

+0

Ese es el tipo de información que estaba buscando. – monksy

+0

Esto también fue interesante: http: //weblogs.java.net/blog/2006/05/04/understanding-weak-references – monksy

2

Java Garbage Collector funciona con un método de marca y barrido. Esto significa que desde un objeto que todavía se usa, se siguen todas las referencias y se marcan los objetos que se visitan de esa manera. De esta forma, los objetos sin referencias no se marcan y deben asegurarse de eliminarse. Por lo tanto, puede asegurarse de que se eliminen todas las referencias a este objeto, de modo que en el próximo giro del Recolector de basura, el elemento se elimine.

Además se puede utilizar

Runtime.getRuntime().gc(); 

para indicar que el recolector de basura debe ejecutar. Nota: no puede estar seguro de que realmente se ejecuta.

+0

El recolector de basura no se basa en el recuento de referencias. Todas las JVM modernas son de marca y barrido, la mayoría de ellas multigeneracionales. –

+0

¿No depende de la implementación de la JVM? – RoflcoptrException

+0

No. El recuento de referencias no le permitirá implementar correctamente la especificación del lenguaje Java debido a problemas con los ciclos de referencia. Por lo tanto, no solo ninguna implementación de JVM existente utiliza el recuento de referencias, ninguna puede y puede cumplir sin implementar también un mecanismo de recopilación completamente diferente y correcto. –

7

No, no puedes. ¿Qué esperarías que pasara si otra variable tuviese una referencia?

Tenga en cuenta que no se puede establecer una objeto en null - sólo se puede establecer una variable en nulo. Si otra variable todavía tiene una referencia al objeto, aún no será elegible para la recolección de basura.

Si cree que necesita hacer esto, eso probablemente significa que está malinterpretando sus datos, o que puede haber una fuga en su código (por ejemplo, una lista a la que solo agrega entradas, referenciada por una estática variable: esas entradas nunca serán elegibles para la recolección de basura mientras el cargador de clases está activo).

Cada JVM tiene su propio GC, pero en Hotspot un objeto será basura recolectada la próxima vez que el GC ejecute la generación en la que ese objeto "vive" (suponiendo que no tiene un finalizador, lo que complica las cosas). Si el objeto está en una generación "joven", eso probablemente sucederá muy pronto; si está en una generación "vieja", bien podría llevar más tiempo.

Es posible que desee ver el Java 6 GC tuning documentation para obtener más información, aunque, por supuesto, las cosas han cambiado desde entonces para OpenJDK 7 etc.

+0

Bueno, como dije en un comentario, estoy creando muchos objetos, y cuando termine de procesarlos ya no los necesito. Tengo una sospecha [apoyada por el perfilador] de que no están siendo desorientados. – monksy

+0

@monksy: Entonces eso sugiere que tienes una referencia al acecho en alguna parte, suponiendo que el GC se está ejecutando. –

+1

Esa es mi sospecha [La cantidad de objetos actualmente iniciados casi nunca cae, sigue creciendo] ¿Hay alguna herramienta que sugiera que podría ayudar con esto? Tuve que usar Netbeans Profiler solo para descubrirlo. – monksy

1

Usted oído mal, pero de nuevo la descripción es demasiado malo.

No establece un objeto como nulo, establece una variable como nula. Si la variable se puede usar para llegar a un objeto, entonces la variable tiene una "referencia" al objeto. Establecer la variable a nulo es lo mismo que la variable "perder la referencia" al objeto.

Una vez que Java detecta que un objeto o un grupo de objetos no puede ser alcanzado por el programa en ejecución, eliminará esos objetos de la memoria. No los eliminará de memoria un momento antes, porque si lo hiciera, y alguna otra parte del programa intentara usar una referencia al objeto, entonces la referencia fallaría de una manera que no es permisible en Java.

El truco consiste en no establecer solo una referencia a nulo, debe establecer todas las referencias que se hayan podido hacer para anularlas. Es por eso que es importante considerar cada vez que crea una nueva referencia, porque desea crearlas de tal manera que eventualmente se borren (a menos que desee una pérdida de memoria).

Cuestiones relacionadas