En Java, finalize
se llama en un objeto (que anula ella) cuando está a punto de ser basura, colectados, por lo que cuando es inalcanzable. Pero, ¿qué sucede si el finalizador hace que el objeto sea alcanzable nuevamente, qué ocurre entonces?¿Qué sucede si un finalizador hace que un objeto sea accesible?
Respuesta
El objeto no se recogerá hasta que se pone de nuevo inalcanzable.
De acuerdo con JavaDoc, no se volverá a llamar a finalize().
Sí, esta es la razón por la que no usa finalizadores (bueno, una de las muchas razones).
No es una colección de referencia que se hace para hacer estas cosas. Lo buscaré y lo publicaré aquí en un segundo, pero creo que es PhantomReference.
Sí, PhantomReference:
objetos de referencia Phantom, que están en cola después de que el colector determina que sus referentes de lo contrario se pueden reutilizar. Las referencias ficticias se utilizan con mayor frecuencia para programar acciones de limpieza premortem de una manera más flexible que la que es posible con el mecanismo de finalización de Java.
Si lee cuidadosamente la descripción de la API, verá que el finalizador puede hacer que el objeto vuelva a estar accesible. El objeto no se descartará hasta que sea inalcanzable (nuevamente), pero finalize()
no se invocará más de una vez.
En realidad, el finalizador * does * hace que el objeto sea muy accesible a través de la referencia rooteada entre el momento en que se encuentra que el objeto es inalcanzable y la hora en que se ejecuta el finalizador. Si durante ese tiempo el objeto que resultó ser inalcanzable se convierte en la única referencia que sobrevive a algún otro objeto, ese otro objeto no será coleccionable hasta que se ejecute el finalizador o esa referencia se invalide por algún otro medio. – supercat
A continuación, el objeto no recibe basura recogida, básicamente. Esto se llama objeto resurrección. Realiza una búsqueda de ese término, y deberías obtener un montón de artículos interesantes. Como mencionó Jim, un punto importante es que el finalizador solo se ejecutará una vez.
lo que realmente hace otra pasada para comprobar y asegurarse de que no hay más referencias al objeto. Como fallará esa prueba en su segunda pasada, no liberará la memoria del objeto.
Dado que finalizar solo se llama una sola vez para un objeto dado, la próxima vez cuando no tenga referencias, simplemente liberará la memoria sin llamar a finalizar. Alguna buena información here en la finalización.
- 1. ¿ReflectionProperty :: setAccessible hace que la propiedad sea accesible para siempre?
- 2. ¿Cómo hacer que un objeto sea accesible para todas las actividades en un programa de Android?
- 3. ¿Qué hace que un lenguaje sea orientado a objetos?
- 4. ¿Qué hace que Ruby sea un lenguaje elegante?
- 5. ¿Qué hace que un portlet JSR-286 sea compatible?
- 6. ¿Qué hace que STL sea rápido?
- 7. ¿Qué hace que Ometa sea especial?
- 8. ¿Qué hace que Oracle sea más escalable?
- 9. ¿Qué hace que el encuadernado sea lento?
- 10. ¿Qué sucede si un hilo se cuelga en un proceso?
- 11. Open MPI/MPICH - ¿Qué sucede si un nodo termina?
- 12. ¿Es seguro llamar a un RCW desde un finalizador?
- 13. ¿Cómo se puede hacer que un sitio web sea accesible solo cuando alguien tiene un dongle?
- 14. ¿Qué le sucede a un objeto NSArray cuando se codifica?
- 15. ¿Qué hace que ágil sea mejor que shiro?
- 16. ¿Qué hace que Git sea mejor que Subversion para fusionarse?
- 17. cómo añadir un finalizador en un TVAR
- 18. ¿Qué hace que PostgreSQL sea más avanzado que MySQL?
- 19. ¿Necesita implementar un finalizador en una clase que usa TcpClient?
- 20. ¿Qué sucede si un servicio se inicia varias veces?
- 21. ¿Qué sucede si no elimino un Objeto de búfer de vértice cuando mi programa se cierra?
- 22. ¿Qué hace que este "declarador no sea válido"? C++
- 23. ¿Qué sucede si main() no devuelve un valor int?
- 24. ¿Qué sucede si no devuelve un valor en C++?
- 25. En Akka, ¿qué sucede si veo() un ActorRef muerto?
- 26. ¿Qué sucede exactamente si elimina un objeto? (GCC) (Cuando doble eliminar los accidentes?)
- 27. ¿Qué sucede si un bloque finally arroja una excepción?
- 28. ¿Qué sucede si un mensaje se revierte en MQ?
- 29. ¿Qué sucede si más de un hilo intenta acceder al objeto singleton
- 30. Qué sucede con app.config en un proyecto al que se hace referencia
No, es un motivo por el que no se escribe un finalizador muy incompleto (si no hubiera otros motivos suficientes). –