Question

Si je l'appelle finalize() sur un objet à partir de mon code de programme, le JVM toujours exécuter la méthode à nouveau lorsque le garbage collector processus de cet objet?

Ce serait environ exemple:

MyObject m = new MyObject();

m.finalize();

m = null;

System.gc()

Serait de l'appel explicite à finalize() faire de la JVMs 'garbage collector de ne pas exécuter l' finalize() méthode sur l'objet m?

Était-ce utile?

La solution

Selon ce programme de test simple, la JVM va encore faire son appel à finalize (), même si vous l'avez explicitement appelé:

private static class Blah
{
  public void finalize() { System.out.println("finalizing!"); }
}

private static void f() throws Throwable
{
   Blah blah = new Blah();
   blah.finalize();
}

public static void main(String[] args) throws Throwable
{
    System.out.println("start");
    f();
    System.gc();
    System.out.println("done");
}

La sortie est:

démarrer
la finalisation de!
la finalisation de!
fait

Chaque ressource, il dit ne jamais appeler finalize() explicitement, et à peu près jamais à même de mettre en œuvre la méthode, car il n'existe aucune garantie quant à savoir si et quand il sera appelé.Vous êtes mieux de simplement fermer l'ensemble de vos ressources manuellement.

Autres conseils

On doit comprendre que le Garbage Collector(GC) Flux de travail pour comprendre la fonction de finaliser.de l'appelant .finalize() ne pourra pas invoquer le garbage collector, ni système d'appel.gc.En fait, Ce qui aidera à finaliser le codeur est de déclarer la référence de l'objet en tant que "non référencé".

GC forces de suspension sur le fonctionnement de la JVM, ce qui crée une brèche sur la performance.Pendant le fonctionnement, GC va parcourir tous les objets référencés, à partir de la racine de l'objet(le principal de votre appel de méthode).Cette période de suspension peut être réduite, en déclarant les objets non référencés manuellement, car il permettra de réduire les coûts d'opération à déclarer la référence de l'objet obsolète par le système automatisé de l'exécuter.En déclarant finalize(), codeur définit la référence à l'objet obsolète, donc à la prochaine exécution de la GC opération, GC exécuter un balayage des objets sans utiliser de temps de fonctionnement.

Citation:"Après la méthode finalize a été appelée pour un objet, aucune action supplémentaire n'est prise jusqu'à ce que la machine virtuelle Java a encore déterminé qu'il n'y a plus aucun moyen par lequel cet objet peut être consulté par n'importe quel thread qui n'a pas encore trouvé la mort, dont les actions possibles par d'autres objets ou des classes qui sont prêts à être finalisé, au point où l'objet peut être ignoré."de l'API Java Doc sur java.Objet.finalize();

Pour des explications détaillées, vous pouvez également vérifier: javabook.computerware

La méthode finalize est jamais appelé plus d'une fois par une JVM pour tout objet donné.Vous ne devriez pas être en s'appuyant sur " finaliser de toute façon car il n'y a aucune garantie qu'elle sera invoquée.Si vous appelez de finaliser parce que vous avez besoin pour exécuter nettoyer le code alors préférable de le mettre dans une méthode distincte et de le rendre explicite, e.g:

public void cleanUp() {
  .
  .
  .
}

myInstance.cleanUp();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top