Maison > Java > javaDidacticiel > Pourquoi les appels finalize() déclenchent-ils de manière inattendue des fermetures de flux dans Java 8 ?

Pourquoi les appels finalize() déclenchent-ils de manière inattendue des fermetures de flux dans Java 8 ?

Susan Sarandon
Libérer: 2024-12-14 09:46:25
original
382 Les gens l'ont consulté

Why Are finalize() Calls Unexpectedly Triggering Stream Closures in 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();
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal