2010-07-22 15 views
29

se me dio la siguiente frase en una entrevista:Java Entrevista Pregunta: método finalize()

La invocación de método de un objeto finalize() es el último que que sucede antes de un objeto es garbaged recogido.

tuviera que responder por:

  • Verdadero Falso

he elegido True pero estaba equivocado. ¿Puede explicarme por qué?

+0

Por favor, lea este artículo: http://www.codeguru.com/java/tij/tij0051.shtml –

+0

@Vash, dicho artículo es muy fuera de fecha – finnw

Respuesta

58

El orden es diferente:

  1. Primera el objeto es recogió.
  2. Luego el objeto es finalizado.

Ver http://java.dzone.com/articles/ocajp-7-object-lifecycle-java

ciclo de vida del objeto:

  1. Creado
  2. En uso (muy accesible)
  3. invisible
  4. Inalcanzable
  5. Collected
  6. Finalizada
  7. desasignada
+2

Confirmado. * collect * no es el estado final del ciclo de vida del objeto, es * desasignado *. +1 para el enlace y aprender algo hoy :) –

+0

Muchas gracias esto. Conocimiento muy útil. – Cambium

+1

¡El enlace está roto! –

2

No hay garantía de que siempre se invocará finalize(), o incluso que la recolección de basura se ejecutará en absoluto.

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

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

+8

esto no responde a la pregunta – unbeli

+0

en parte respuestas la pregunta y proporciona información útil sobre por qué 'finalize()' no es tan útil como muchos programadores piensan. – Jesper

+0

podría ser bueno rociar trivialidades útiles, pero es aún mejor seguir con el tema. – unbeli

8

Creo que da a entender que, en realidad, hay otras cosas que se pueden hacer/pasar al objeto antes de que el GC realmente lo descarte.

Para citar la referencia:

[...] El método finalize puede tomar cualquier acción , incluyendo la realización de este objeto disponible de nuevo para otros hilos; el propósito habitual de finalizar, , sin embargo, es realizar las 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 romper la conexión antes de que el objeto está permanentemente desechado. [...]

En esta luz, el proceso de finalización no es lo último antes de que el GC lo descarte.

2

supongo que se puede defender ambas respuestas, finalize() es llamado por el recolector de basura antes de que recoge el objeto, pero no se puede estar seguro de que nunca lo hará ser el caso antes de que termine la aplicación. No todos los objetos que son alegatos de ser recolectados son recogidos. Es posible que nunca dependa del método finalize() para llamar a ningún objeto.

1

El pedido es incorrecto, ya que DR ya se mostró.

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

Entonces ¿quién debe tomar medidas para finalizar un objeto antes de que se detecte esta condición de '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 los objetos se anula). Y realmente no queremos finalizar los objetos que todavía se pueden alcanzar, p. 'en uso'.

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

0

Puede resucitar el objeto en el método de finalización haciendo que algo apunte a él para que el GC no pueda ser recogido por el GC 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 ha sido marcado/marcado como finalizado. entonces, antes de GC puede pasar el método de finalización de llamada o el objeto puede resucitar.

Cuestiones relacionadas