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(); } }
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!