Rumah > Java > javaTutorial > Mengapakah Panggilan finalize() Mencetuskan Penutupan Strim Tanpa Jangka di Java 8?

Mengapakah Panggilan finalize() Mencetuskan Penutupan Strim Tanpa Jangka di Java 8?

Susan Sarandon
Lepaskan: 2024-12-14 09:46:25
asal
382 orang telah melayarinya

Why Are finalize() Calls Unexpectedly Triggering Stream Closures in Java 8?

Memahami Invocation Finalize() in Java 8

Dalam peralihan dari Java 7 ke Java 8, aplikasi pemprosesan mesej kadangkala menghadapi pengecualian berkaitan dengan penutupan strim. Siasatan telah mendedahkan panggilan yang tidak dijangka untuk memuktamadkan() pada objek yang memegang strim, yang membawa kepada penutupan mereka semasa operasi baca aktif.

Pada mulanya membingungkan, tingkah laku ini boleh dikaitkan dengan aspek pengumpulan sampah yang kurang difahami. Walaupun dengan rujukan kepada objek yang terdapat pada tindanan dan semasa panggilan kaedah aktif, objek masih boleh dianggap tidak boleh dicapai. Ini berlaku apabila tiada kod berikutnya mengakses rujukannya, menjadikannya "mati."

Seperti yang dilihat dalam contoh yang dipermudahkan, walaupun semasa pelaksanaan kaedah aktif, objek boleh dimuktamadkan dan sampah dikumpul:

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();
    }
}
Salin selepas log masuk

Dalam contoh ini, rujukan objek FinalizeThis kekal dalam skop, namun ia tidak dapat dicapai kerana ketiadaan interaksi selanjutnya dengannya. Akibatnya, ia menjadi layak untuk dimuktamadkan dan kutipan sampah seterusnya.

Dalam kes yang dilaporkan, objek MIMEBodyPart mungkin telah disimpan dalam pembolehubah setempat dengan awalan m_, memenuhi syarat untuk kemungkinan tidak dapat dicapai. Dengan mengubah suai lokasi storan objek, seperti yang dicadangkan dalam ulasan, gelagat pemuktamadkan dihentikan.

Perlu diambil perhatian bahawa isu pemuktamadan ini boleh dielakkan dengan memperkenalkan arahan kompilasi. Bendera -Xcomp memaksa kompilasi kaedah sebelum pelaksanaan, membenarkan pengkompil melakukan analisis kebolehcapaian dan mengelakkan panggilan pemuktamadkan yang tidak wajar.

Atas ialah kandungan terperinci Mengapakah Panggilan finalize() Mencetuskan Penutupan Strim Tanpa Jangka di Java 8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan