Question

    

Cette question a déjà une réponse ici:

         

Ceci est la plupart du temps par curiosité.

Je flânais si quelqu'un a rencontré une bonne utilisation pour Object.Finalize () sauf pour le débogage / enregistrement / fins de profilage?

Si vous ne l'avez pas rencontré de ce que diriez-vous d'un bon usage serait?

Était-ce utile?

La solution

Si votre objet Java utilise JNI pour indiquer le code natif d'allouer de la mémoire native, vous devez utiliser Finaliser pour vous assurer qu'il se libère.

Autres conseils

Fin de la partie ici, mais je pensais encore carillon:

L'une des meilleures utilisations que j'ai trouvé pour finalizers est d'appeler des méthodes de terminaison explicites qui, pour une raison quelconque, ne sont pas appelés. Lorsque cela se produit, nous enregistrons également la question parce qu'il est un BUG!

Parce que:

  • Il n'y a aucune garantie que finaliseurs seront exécutées rapidement (ou techniquement du tout), par la spécification du langage
  • L'exécution est largement tributaire de la mise en œuvre JVM
  • L'exécution peut parfois être retardé si le GC a une priorité de fil inférieur

Cela laisse seulement une poignée de tâches qu'ils peuvent aborder sans grand risque.

  1. fermer les connexions externes (db, socket etc)
  2. les fichiers ouverts à proximité. peut être même essayer d'écrire quelques informations supplémentaires.
  3. Connexion
  4. si cette classe exécute les processus externes qui devraient exister que lorsque l'objet existe, vous pouvez essayer de les tuer ici.

Mais il est juste une solution de repli qui est utilisé est le mécanisme « normal » ne fonctionne pas. mécanisme normal devrait être lancé explicitement.

ressources de sortie qui doivent être libérés manuellement dans des circonstances normales, mais ne sont pas libérés pour une raison quelconque. Peut-être avec un avertissement écrire dans le journal.

Je l'utilise pour écrire de nouveau les données à une base de données lors de l'utilisation des références souples pour mettre en cache la base de données adossés à des objets.

Je vois un bon usage pour finalize (): en libérant des ressources qui sont disponibles en grandes quantités et ne sont pas exclusifs.

Par exemple, par défaut, il y a 1024 fichiers poignées disponibles pour un processus Linux et environ 10000 pour Windows. Ceci est à peu près, donc pour la plupart des applications si vous ouvrez un fichier, vous ne devez pas appeler .close () (et utiliser le laid essayer ... enfin blocs), et vous serez OK - enfin () sera gratuit pour vous quelque temps plus tard. Cependant, pour quelques morceaux de code (comme les applications serveur intensives), avec libération des ressources .close () est un must, sinon enfin () peut être appelé trop tard pour vous et vous pouvez manquer de descripteurs de fichiers.

La même technique est utilisée par Swing - ressources du système d'exploitation pour afficher les fenêtres et le dessin ne sont pas libérés par toute méthode .close (), mais juste par finalize (), de sorte que vous n'avez pas à vous soucier de tous .close () ou méthodes .Dispose (), comme dans SWT par exemple.

Cependant, quand il y a nombre très limité de ressources, ou vous devez ressource « verrou » pour l'utiliser, souvenez-vous aussi de « déverrouiller » il. Par exemple, si vous créez un verrou de fichier sur un fichier, rappelez-vous aussi supprimer ce verrou, sinon personne d'autre sera en mesure de lire ou d'écrire ce fichier et cela peut conduire à des impasses - alors vous ne pouvez pas compter sur Finaliser () pour supprimer ce verrou pour vous -. vous devez le faire manuellement au bon endroit

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top