android/java - cómo ser notificado cuando no hay referencia a una instancia

esta pregunta es para android o java. supongamos que tengo una instancia de una clase (incluso un hilo).

deseo que para que sea infalible contra el olvido de desechar/cerrar la instancia (y evitar posibles pérdidas de memoria), si no hay más referencias a esta instancia, llamará automáticamente a un método específico, desechando/cerrando ( en el caso de un hilo, probablemente se interrumpa solo).

¿Es posible hacer cumplir tal cosa? si es necesario, no me importa que tal cosa ocurra solo durante la GC.

preguntado el 22 de mayo de 12 a las 15:05

3 Respuestas

si no hay más referencias a esta instancia, llamará automáticamente a un método específico, eliminándose/cerrando (en caso de un hilo, probablemente se interrumpirá)

finalizar() hace lo que describes aquí. Sin embargo, rara vez lo ve usado, y hay algunas trampas al usarlo. Como no puede controlar la recolección de basura, no puede estar seguro de cuándo se ejecutará la finalización, ¡si es que alguna vez se ejecuta! De la API:

Sin embargo, el propósito habitual de finalizar es realizar acciones de limpieza antes de que el objeto se descarte de manera irrevocable. Por ejemplo, el método de finalización para un objeto que representa una conexión de entrada/salida podría realizar transacciones de E/S explícitas para interrumpir la conexión antes de que el objeto se descarte de forma permanente.

No puedes hacer cumplir recolección de basura. Solo puede sugerir que la JVM lo haga usando System.gc (), pero no se garantiza que se hará.

contestado el 22 de mayo de 12 a las 15:05

no hablé de esto He escrito sobre ser notificado cuando no hay referencia a la instancia. No me importa cuándo ocurrirá la GC. por favor lea la pregunta de nuevo. - desarrollador de Android

Cuando no haya más referencias a un objeto, se recolectará como basura cuando el GC lo encuentre. No vas a encontrar fugas de memoria buscando objetos ya desreferenciados... ¡son los que no están desreferenciados los que te atraparán! - Ancanto

así que supongamos que creo un nuevo hilo y lo ejecuto, pero no guardo ninguna referencia a él, ¿alguna vez llamará a finalizar, incluso si el hilo aún se está ejecutando? si es así, ¿puede escribir un código de muestra que lo demuestre? - desarrollador de Android

stackoverflow.com/a/6409290/879114 ver esta respuesta. En resumen, el subproceso no se recolectará como basura hasta que finalice o muera. - Zavior

Sé que es muy tarde, pero espero que algún día pueda ayudar a alguien.

Puede recibir este tipo de eventos mediante el uso de la biblioteca que estoy desarrollando llamada gcradar. Proporciona eventos cuando un objeto queda huérfano y después de la recolección de basura real del objeto.

Cualquier sugerencia para mejorar la biblioteca es bienvenida.

Respondido el 18 de diciembre de 13 a las 16:12

la biblioteca utiliza las implementaciones de la clase de referencia de Java para derivar devoluciones de llamada al recorrer el estado de diferentes objetos en tiempo de ejecución. Si está interesado más, puede consultar el código. - r.daneel.olivaw

parece ser de código cerrado, y que ni siquiera hay un código de muestra, y ninguna explicación de cómo funciona realmente. - desarrollador de Android

Bueno, es un trabajo en progreso y les puedo asegurar que no es de código cerrado. - r.daneel.olivaw

Hola, si todavía estás interesado, he movido el código a un repositorio de GitHub que debería ser más accesible. Por favor revise mi respuesta modificada. - r.daneel.olivaw

No hay forma de acceder a las referencias que tiene la máquina virtual. Como sugirió Zavior, la única forma de saber con certeza que un objeto, o una "isla" de objetos, es inaccesible, es usar el finalize método.

Tenga en cuenta que solo recibirá una notificación durante las ejecuciones de GC. Por lo tanto, realmente no ayuda a cerrar/eliminar recursos a los que todavía se hace referencia pero que deberían cerrarse. Si también quiere hacer eso y no quiere usar construcciones como try/catch/finally, debe escribir una clase de administrador para los recursos.

Con cualquiera de las posibilidades, incluida una clase de administrador, no obtendrá una forma "a prueba de balas" de consolidar sus recursos. Ser cuidadoso es la mejor solución en mi humilde opinión.

EDIT:

He encontrado este hilo eso puede ser útil.

contestado el 23 de mayo de 17 a las 13:05

Entonces, ¿no hay forma de decirle a la VM que me notifique cuando descubrió que ya no se puede acceder al objeto? tal vez referencia fantasma? - desarrollador de Android

Como se indicó anteriormente, la máquina virtual no expone nada parecido a un refcount. la única forma de emularlo es hacer el conteo usted mismo (por ejemplo, clase de gerente) y ser consciente del hecho de que está lejos de ser a prueba de balas. - Kostja

¿Qué pasa con este enlace, que obtuve usando su enlace: java.dzone.com/articles/letting-garbage-collector-do-c ? ¿Como lo usas? sabes si funciona? - desarrollador de Android

No sé si funciona porque no lo he probado, solo pensé que podría ayudarte a probarlo por ti mismo. - Kostja

He intentado leerlo y comprobar cómo funciona. lamentablemente no entiendo ni siquiera cómo usarlo. si alguien más pudiera decirme cómo hacer que funcione, le daría una "V" como respuesta. - desarrollador de Android

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.