2010-07-22 20 views
29

mi è stata data la seguente dicitura in un'intervista:Java Domanda Di Intervista: finalizzare() metodo

L'invocazione del metodo finalize() di un oggetto è l'ultima cosa che accade prima che un oggetto è garbaged raccolto.

ho dovuto rispondere da:

  • Vero
  • False

ho scelto True ma era sbagliato. Puoi spiegarmi perché?

+0

Si prega di leggere questo articolo: http://www.codeguru.com/java/tij/tij0051.shtml –

+0

@Vash, tale articolo è molto out-of-date – finnw

risposta

58

L'ordine è diverso:

  1. Prima l'oggetto è collezionati.
  2. Quindi l'oggetto è finalizzato.

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

ciclo di vita dell'oggetto:

  1. Creato
  2. In uso (fortemente raggiungibile)
  3. invisibile
  4. irraggiungibile
  5. Raccolti
  6. Finalizzato
  7. deallocata
+2

Confermato. * collect * non è lo stato finale del ciclo di vita dell'oggetto, è * deallocato *. +1 per il collegamento e imparare qualcosa oggi :) –

+0

Grazie mille. Conoscenza molto utile. – Cambium

+1

Il collegamento è rotto! –

2

Non è garantito che venga chiamato sempre finalize() o che la raccolta di dati inutili venga eseguita.

Supponiamo che il programma termini (chiamando System.exit() o quando tutti i thread in esecuzione raggiungono la fine), quindi la JVM si chiuderà, non pulirà tutto e chiamerà finalize() su tutti gli oggetti.

Pertanto, non è una buona idea mettere le attività di pulizia che devono assolutamente essere eseguite in un metodo finalize().

+8

questo non risponde alla domanda – unbeli

+0

ha in parte le risposte la domanda e fornisce alcune informazioni utili sul perché 'finalize()' non è utile come molti programmatori pensano. – Jesper

+0

potrebbe essere bello spargere trivia utile in giro, ma è ancora più bello attenersi all'argomento. – unbeli

8

Penso che suggerisca il fatto che in realtà ci sono altre cose che possono essere fatte/accadute all'oggetto prima che il GC la scartasse davvero.

citare il riferimento:

[...] Il metodo finalize può prendere ogni azione, compresa rendendo questo oggetto nuovamente disponibile per altri thread; il solito scopo di finalizzare, , tuttavia, è eseguire azioni di pulizia prima che l'oggetto venga scartato irrevocabilmente. Ad esempio, il metodo finalize per un oggetto che rappresenta una connessione di ingresso/uscita potrebbe effettuare transazioni esplicite I/O per interruzione del collegamento prima dell'oggetto è permanentemente scartato.

Quindi, in questa luce, il processo di finalizzazione non è l'ultima cosa prima che il GC lo scarti.

2

Credo che si può difendere entrambe le risposte, finalize() viene chiamato dal garbage collector prima che raccoglie l'oggetto, ma non si può essere sicuri che sarà mai sii il caso prima che l'applicazione finisca. Non tutti gli oggetti che possono essere raccolti devono essere raccolti. Non si può mai dipendere dal metodo finalize() da chiamare per qualsiasi oggetto.

1

L'ordine è errato, come già mostrato DR.

Un oggetto cambia stato a raccolto quando il gc ha riconosciuto che l'oggetto non è raggiungibile.

Quindi chi dovrebbe intervenire per finalizzare un oggetto prima che fosse rilevata questa condizione "non raggiungibile"? Infatti è il garbage collector che contrassegna gli oggetti raccolti per la finalizzazione (se gli oggetti finalizzano il metodo è sovrascritto). E davvero non vogliamo finalizzare oggetti che sono ancora raggiungibili, ad es. 'in uso'.

Bella domanda comunque, perché tendi a dire "sì è vero".

0

È possibile resuscitare l'oggetto nel metodo finalize facendo in modo che qualcosa punti ad esso in modo che l'oggetto non possa essere raccolto dal GC dopo aver chiamato il metodo finalizzato. ma quando l'oggetto diventa nuovamente disponibile per la garbage collection, non chiamerà il metodo finalizzato di quell'oggetto che è stato contrassegnato/contrassegnato come finalizzato. quindi prima di GC può accadere che il metodo di finalizzazione della chiamata o l'oggetto possa resuscitare.