preguntas para metodo examen entrevista java garbage-collection finalize

para - Pregunta de la entrevista Java: método finalize()



metodo finalize java (6)

Creo que insinúa que el hecho de que realmente haya otras cosas que se pueden hacer / suceder al objeto antes de que el GC realmente lo descarte.

Para citar la referencia:

[...] El método de finalización puede realizar cualquier acción, incluido hacer que este objeto esté disponible de nuevo para otros subprocesos ; Sin embargo, el propósito habitual de finalizar es realizar acciones de limpieza antes de que el objeto se descarte irrevocablemente . 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 permanentemente. [...]

Entonces, en este sentido, el proceso de finalización no es lo último antes de que el GC lo descarte.

Me dieron la siguiente frase en una entrevista:

La invocación del método finalize () de un Objeto es lo último que sucede antes de que se recolecte un objeto.

Tuve que responder por:

  • Cierto
  • Falso

He elegido True pero estaba mal. ¿Me puede explicar por qué?



El orden es incorrecto, como DR ya mostró.

Un objeto cambia su estado a recopilado cuando el gc ha reconocido que el objeto es inalcanzable.

Entonces, ¿ quién debería tomar medidas para finalizar un objeto antes de que se detectara esta condición "inalcanzable"? De hecho, es el recolector de basura el que marca los objetos recolectados para su finalización (si el método de finalización de objetos está anulado). Y realmente no queremos finalizar los objetos que aún son accesibles, por ejemplo, ''en uso''.

Buena pregunta de todos modos, porque tiendes a decir ''sí, es verdad''.


No hay garantía de que siempre se llame a finalize() , ni siquiera que se ejecute la recolección de basura.

Supongamos que su programa finaliza (ya sea llamando a System.exit() o cuando todos los subprocesos en ejecución llegan a su fin), la JVM simplemente se cerrará, no limpiará todo y llamará finalize() a todos los objetos.

Por lo tanto, no es una buena idea poner tareas de limpieza que absolutamente deben ejecutarse en un método finalize() .


Puede resucitar el objeto en el método de finalización haciendo que algo apunte hacia él para que el GC no pueda recoger el objeto después de llamar al método finalizado. pero cuando el objeto vuelve a estar disponible para la recolección de basura, no llamará al método finalizado de ese objeto, ya que se ha marcado / marcado como finalizado. así que antes de GC puede suceder que el método de finalización de la llamada o el objeto pueda resucitar.


Supongo que puede defender ambas respuestas, el recolector de basura llama a finalize() antes de que recoja el objeto, pero no puede estar seguro de que ese será el caso antes de que finalice la aplicación. No todos los objetos que pueden ser recolectados como basura deben ser recolectados. Nunca puede depender del método finalize() que se llamará para ningún objeto.