2010-11-19 11 views
6

es que hay una manera de comprobar si un objeto se pueden traer el recolector de basura?Comprobar si el objeto se pueden traer recolector de basura

En algún lugar de mi código tengo una referencia a un objeto:

MyObject mo = myObject; 

Luego, a través de Eclipse depurador, me da la posición de memoria objetos. Después, me puse la nula referencia:

mo = null; 

¿Hay alguna manera de comprobar si el objeto ha hecho referencia anteriormente es ahora adecuado para la recolección de basura o si hay algún lugar otra referencia a ella?

Muchas gracias,

Stefan

Respuesta

13

No se puede hacer esto en tiempo de ejecución con un objeto arbitrario, y de hecho no lo es totalmente posible hacer esto de forma determinista. Sin embargo, hay dos opciones que pueden ser adecuados en función de sus necesidades:

  1. Tome un volcado del montón después de establecer la referencia a null, y luego cargarla en una herramienta de análisis de heap como jhat o un perfilador que apoya esto Estas herramientas deberían permitirle atravesar el camino desde las raíces de la GC y así verificar si su objeto aún es alcanzable o no.
  2. envolver el objeto en un PhantomReference con un determinado ReferenceQueue. Cuando la referencia se pone en cola, usted sabe que el objeto ha sido recolectado. (Desafortunadamente, si la referencia está sin cola, podría ser porque el objeto todavía es alcanzable, o podría ser porque el GC aún no ha inspeccionado el objeto. Como con todas las preguntas relacionadas con GC, ¡la recolección de basura no es un proceso determinista!)

en general, sin embargo, estoy de acuerdo en que la mejor opción es ser conscientes de problemas de pérdida de memoria y diseñar la aplicación para evitarlas. Si tiene una fuga de memoria, debería ser lo suficientemente obvio, y luego puede enfocar sus energías en encontrar el problema (nuevamente volcando y analizando el montón de objetos que son incorrectamente accesibles).

Los pasos anteriores son relativamente lentos, y no deberían ser algo que haga después de cada cambio solo para tranquilizarse, sino que son herramientas que utilizaría para investigar un problema específico .

+0

es una aplicación huuuuuuuuuuuuuge, donde hemos tenido problemas de memoria. una optimización debería ahora mejorar, pero no tanto como esperábamos. por lo tanto, nos gustaría saber si los objetos específicos son basura recolectada. gracias por su respuesta, lo probaré! – swalkner

+0

Correcto obtendrá una basura pura: D – delive

1

No. El único que hay que hacer es tener cuidado y tener en cuenta que las pérdidas de memoria pueden existir en Java al escribir su aplicación.

El único que puede hacer, es utilizar herramientas para tratar de encontrar donde las pérdidas de memoria vienen de cuándo se dio cuenta un problema. Recomiendo encarecidamente Memory Analyzer para este propósito.

+0

gracias por su respuesta! por supuesto teniendo cuidado es lo más importante, pero a veces simplemente no es suficiente o posible (véase la respuesta a Doyle andrzey) – swalkner

Cuestiones relacionadas