2010-02-04 7 views
1

Vous pouvez penser que dans les 15-20 minutes, j'ai demandé 4-5 questions sur le même sujet, donc j'ai besoin d'un tutoriel à ce sujet. Mais je reçois ces questions en lisant sur GC. Donc, ma question est GC appellera une méthode finalize() sur une instance seulement une fois de son cycle de vie, même si le même objet est rendu non admissible à garbage collecter dans sa méthode finalize(). Donc, je voulais savoir comment GC va savoir qu'il a exécuté sa méthode finalize() une fois avant de le récupérer pour la deuxième foisGarbage collector et la méthode finalize()

Répondre

4

Honnêtement, votre vie sera beaucoup mieux si vous oubliez qu'il existe finaliseurs. J'ai codé Java pendant des années et n'ai jamais eu de raison d'utiliser un finaliseur.

Ils sont lents, pas bien définis (parfois ils ne fonctionneront jamais!), Et généralement un PITA. Si vous gérez des ressources externes, faites quelque chose le long des lignes de l'interface Closeable et utilisez les blocs try {} finally {} pour les nettoyer. Sinon, essayez autant que vous le pouvez de faire confiance à la langue pour nettoyer la mémoire après elle-même.

1

Implémentation dépendante. On peut supposer que la VM a un bit secret sur chaque objet, ou a une table contenant des objets qui ont déjà été "finalisés". Si je devais deviner, je dirais que le dernier puisque probablement l'ensemble des objets déjà finis qui traînent toujours devrait être petit, ainsi avoir un peu sur chaque objet dans le système semble un peu inutile.

+0

Bit secret. La finalisation peut facilement être un goulot d'étranglement. –

+0

@tackline Intéressant. Merci. –

0

Ah vous à nouveau :)

Notez que sur le sujet de finaliseurs, si vous avez vraiment FORCE un GC en utilisant ForceGargabeCollection de JVMTI, il est précisé que:

« Cette fonction ne cause pas finaliseurs à exécuter. "

Encore une fois, vous ne voulez probablement pas vraiment le faire, mais si vous avez 2K + représentant et 5 questions sur le GC est de penser qu'il est intéressant de continuer à répéter que l'utilisation de ForceGarbageCollection de JVMTI vous pouvez vraiment FORCE une GC.

informations Autoritaire quant à la façon de forcer un GC:

http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection

Questions connexes