Maison >Java >javaDidacticiel >Pourquoi les appels finalize() déclenchent-ils de manière inattendue des fermetures de flux dans Java 8 ?
Comprendre l'invocation de Finalize() dans Java 8
Lors de la transition de Java 7 à Java 8, les applications de traitement de messages ont parfois rencontré une exception liés à la fermeture du cours d'eau. L'enquête a révélé des appels inattendus à finalize() sur des objets contenant des flux, conduisant à leur fermeture lors d'opérations de lecture actives.
Au départ déroutant, ce comportement peut être attribué à un aspect mal compris du garbage collection. Même avec des références à un objet présent sur la pile et lors d'appels de méthodes actifs, un objet peut toujours être considéré comme inaccessible. Cela se produit lorsqu'aucun code ultérieur n'accède à sa référence, la rendant « morte ».
Comme le montre un exemple simplifié, même pendant l'exécution d'une méthode active, un objet peut être finalisé et récupéré :
class FinalizeThis { @Override protected void finalize() { System.out.println("finalized!"); } void loop() { for (int i = 0; i < 1,000,000,000; i++) { // Triggering GC with System.gc() doesn't guarantee garbage collection } } public static void main(String[] args) { new FinalizeThis().loop(); } }
Dans cet exemple, la référence de l'objet FinalizeThis reste dans la portée, mais elle est inaccessible en raison de l'absence d'interaction supplémentaire avec elle. Par conséquent, il devient éligible pour la finalisation et le garbage collection ultérieur.
Dans le cas signalé, l'objet MIMEBodyPart peut avoir été stocké dans une variable locale avec un préfixe m_, remplissant la condition d'inaccessibilité potentielle. En modifiant l'emplacement de stockage de l'objet, comme suggéré dans les commentaires, le comportement de finalisation a cessé.
Il est à noter que ce problème de finalisation peut être contourné en introduisant une directive de compilation. L'indicateur -Xcomp force la compilation de la méthode avant l'exécution, permettant au compilateur d'effectuer une analyse d'accessibilité et d'éviter les appels de finalisation injustifiés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!