Rumah >Java >javaTutorial >Mengapa Objek Java 8 Saya Sangat Boleh Dicapai Dimuktamadkan Lebih Awal?
"Finalize() Called on Strongly Reachable Objects in Java 8"
Isu:
Aplikasi yang dibangunkan dengan Java 7 dan baru-baru ini dinaik taraf kepada Java 8 mengalami pengecualian sekali-sekala yang menunjukkan bahawa a aliran telah ditutup lebih awal. Siasatan mendedahkan bahawa utas pemuktamad sedang menggunakan finalize() secara pra-matang pada objek yang menahan strim, yang mencetuskan penutupan.
Latar Belakang:
Struktur kod melibatkan MIME penulis (MIMEWriter), bahagian badan MIME (MIMEBodyPart), dan strim input (InflaterInputStream) mewakili fail yang dilampirkan. MIMEBodyPart memanjangkan HTTPMessage, yang termasuk kaedah close() yang menutup aliran asas. Selain itu, HTTPMessage mempunyai kaedah finalize() yang cuba memanggil close() pada strim jika masih terbuka.
Jujukan Peristiwa:
Punca:
Kaedah MIMEBodyPart.finalize() digunakan lebih awal oleh utas pemuktamad manakala IOUtil.copy sedang aktif berlari. Java 8 memperkenalkan pengoptimuman pengumpulan sampah yang membolehkan objek dimuktamadkan walaupun ia masih dirujuk oleh pembolehubah tempatan atau panggilan kaedah aktif.
Objek MIMEBodyPart sememangnya boleh dicapai daripada bingkai tindanan MIMEBodyPart.writeBodyPartContent, membayangkan bahawa JVM tidak sepatutnya cuba memuktamadkannya. Walau bagaimanapun, memandangkan rujukan kepada MIMEBodyPart dalam gelung IOUtil.copy tidak digunakan secara aktif, ia menjadi tidak dapat dicapai dan layak untuk pengumpulan dan pemuktamadkan sampah.
Akibat:
The pemuktamadan pramatang boleh membawa kepada tingkah laku yang salah dan potensi data kerugian.
Penyelesaian:
Pendekatan yang disyorkan adalah untuk melawat semula perpustakaan tempatan dan menghapuskan penggunaan kaedah finalize(). Memandangkan pustaka MIME Java Mail tidak mempamerkan isu ini, ia boleh berfungsi sebagai alternatif.
Dugaan Alternatif:
Penjelasan lain yang mungkin melibatkan InflaterInputStream. Jika kaedah MIMEBodyPart.finalize() digunakan semasa operasi tidak terganggu dalam InflaterInputStream, ia boleh mengganggu strim dan mencetuskan pengecualian. Walau bagaimanapun, hipotesis ini memerlukan siasatan lanjut.
Atas ialah kandungan terperinci Mengapa Objek Java 8 Saya Sangat Boleh Dicapai Dimuktamadkan Lebih Awal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!