Question d'entrevue Java: méthode finalize()


On m'a donné la phrase suivante dans une interview:

L'invocation d'un Objet méthode finalize() est la dernière chose cela se produit avant qu'un objet ne soit garbaged recueilli.

Je devais répondre par:

  • Vrai
  • Faux

J'ai choisi True, mais c'était faux. Pouvez-vous svp m'expliquer pourquoi ?

Author: Konrad Garus, 2010-07-22

6 answers

L'ordre est différent:

  1. Premier l'objet est recueillies.
  2. , Puis l'objet est finalisé.

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

Cycle de vie de l'objet:

  1. Créé
  2. En cours d'utilisation (fortement accessible)
  3. Invisible
  4. Inaccessible
  5. Collecté
  6. Finalisé
  7. Désalloué
 59
Author: Daniel Rikowski, 2014-03-25 00:18:52

Je pense que cela laisse entendre que le fait qu'il y ait en fait d'autres choses qui peuvent être faites / arriver à l'objet avant que le GC ne le rejette vraiment.

Pour citer la référence:

[...] La méthode de finalisation peut prendre action, y compris la création de cet objet de nouveau disponible pour les autres threads; le but habituel de finaliser, cependant, est d'effectuer des actions de nettoyage avant que l'objet ne soit irrévocablement jeté. Par exemple, le finaliser méthode pour un objet qui représente une connexion d'entrée/sortie peut effectuer des transactions d'E/S explicites pour rompre la connexion avant le objet est définitivement jeter.[...]

Donc, dans cette optique, le processus de finalisation n'est pas la dernière chose avant que le GC ne le rejette.

 8
Author: bakkal, 2010-07-22 08:18:32

Il n'y a aucune garantie que finalize() sera toujours appelé, ou même que garbage collection s'exécutera du tout.

Supposons que votre programme se termine (soit en appelant System.exit() ou lorsque tous les threads en cours d'exécution atteignent leur fin), alors la JVM va simplement quitter, elle ne nettoiera pas tout et appellera finalize() sur tous les objets.

Par conséquent, mettre des tâches de nettoyage qui doivent absolument s'exécuter dans une méthode finalize() n'est pas une bonne idée.

 2
Author: Jesper, 2010-07-22 08:10:58

Je suppose que vous pouvez défendre les deux réponses, finalize() est appelé par le garbage collector avant de collecter l'objet, mais vous ne pouvez pas être sûr que ce sera jamais le cas avant la fin de l'application. Tous les objets susceptibles d'être collectés ne doivent pas être collectés. Vous ne pouvez jamais dépendre de la méthode finalize() à appeler pour un objet.

 2
Author: rsp, 2010-07-22 08:14:00

L'ordre est faux, comme DR l'a déjà montré.

Un objet change son état en collected lorsque le gc a reconnu que l'objet est inaccessible.

Donc qui devrait prendre des mesures pour finaliser un objet avant que cette condition "inaccessible" ne soit détectée? En fait, c'est le garbage collector qui marque les objets collectés pour la finalisation (si la méthode objects finalize est remplacée). Et nous ne voulons vraiment pas finaliser des objets qui sont encore accessible, par exemple 'en emploi'.

Belle question quand même, parce que vous avez tendance à dire "oui c'est vrai".

 1
Author: Andreas_D, 2017-05-23 12:09:52

Vous pouvez ressusciter l'objet dans la méthode finalize en lui indiquant quelque chose afin que l'objet ne puisse pas être collecté par le GC après avoir appelé la méthode finalized. mais lorsque l'objet redevient disponible pour la récupération de place, il n'appellera pas la méthode finalisée de cet objet car elle a été marquée/marquée comme finalisée. donc, avant GC, il peut arriver que la méthode call finalize ou que l'objet ressuscite.

 0
Author: RoHaN, 2015-07-03 18:39:10