Prinsip String.intern
String.intern():
Kaedah ini ialah kaedah Native
Lapisan bawah memanggil kaedah StringTable::intern C++ untuk melaksanakan
Apabila kaedah intern() dipanggil melalui pernyataan str.intern()
JVM akan mencari dalam kumpulan malar kelas semasa untuk melihat sama ada terdapat String dengan nilai yang sama seperti str
Jika ia wujud, ia akan terus mengembalikan Strnig yang sepadan dalam kolam malar Jika rujukan
tidak wujud, Rentetan yang setara
akan dibuat dalam kolam malar dan kemudian rujukan Rentetan ini dalam kolam malar
akan dikembalikan -------------- -------------------------------- -------------------
Oleh itu, selagi ia adalah objek String yang setara
, menggunakan kaedah intern() mengembalikan rujukan String yang sama dalam kolam malar
Oleh itu, objek String yang setara ini menggunakan == selepas lulus intern( Matchable
String.intern() dalam JDK6
Kolam tetap dalam Jdk6 ialah terletak di PermGen (generasi kekal)
PermGen ialah blok yang digunakan terutamanya untuk menyimpan kawasan saiz Tetap untuk maklumat kelas yang dimuatkan dan kumpulan rentetan
------------------- ---------------- --------------------------------- ------
Apabila menjalankan kaedah intern()
Apabila tiada rentetan setara dalam kolam malar, JVM akan mencipta rentetan setara dalam kolam malar
dan kemudian mengembalikan rujukan kepada rentetan
Selain itu, JVM akan secara automatik Menyimpan koleksi rentetan yang digunakan sebelum ini dalam kolam
Masalah utama dengan menggunakan kaedah intern() dalam Jdk6 ialah kolam malar disimpan dalam PermGen (penjanaan kekal)Nota:
Pertama sekali, PermGen ialah kawasan bersaiz tetap Secara amnya, saiz lalai PermGen berbeza pada platform yang berbeza
Ia adalah kira-kira antara 32M dan 96M.
Oleh itu, anda tidak boleh menggunakan kaedah intern() untuk rentetan masa jalan yang tidak terkawal (seperti maklumat input pengguna, dll.),
Jika tidak, ia berkemungkinan menyebabkan limpahan memori PermGen
Kedua, objek String disimpan dalam Java heap Area, Java heap area dan PermGen diasingkan secara fizikal,
Oleh itu, jika operasi pelatih dilakukan pada berbilang objek rentetan yang tidak sama rata,
ia akan menghasilkan banyak rentetan pendua dalam memori, yang akan menyebabkan kehilangan prestasi.
String.intern() dalam JDK7
Jdk7 mengalihkan kumpulan malar dari kawasan PermGen ke kawasan timbunan Java
Apabila menjalankan operasi intern
Apabila kolam malar Jika rentetan sudah wujud, kembalikan terus rujukan rentetan
Jika tidak, salin rujukan objek rentetan ke kolam malar dan kembalikan
Saiz kawasan timbunan secara amnya tidak terhad, jadi alihkan kolam malar dari kawasan PremGen Kawasan timbunan menjadikan penggunaan kolam malar tidak lagi terhad kepada saiz tetap
Selain itu, objek dalam kolam malar yang terletak di kawasan timbunan boleh dikumpul sampah
apabila rentetan dalam kolam malar tidak lagi menunjuk kepadanya Apabila dirujuk, JVM akan mengitar semula rentetan
Anda boleh menggunakan parameter mesin maya -XX:StringTableSize untuk menetapkan saiz peta kolam rentetan
Kolam rentetan ialah dilaksanakan secara dalaman sebagai HashMap
Jadi apabila anda boleh menentukan program Apabila bilangan rentetan pelatih diperlukan
Anda boleh menetapkan saiz peta kepada nombor * 2 yang diperlukan (mengurangkan konflik cincang)
Ini akan buat String.intern() hanya memerlukan masa tetap dan
String boleh disimpan dalam kolam rentetan dengan jumlah memori yang agak kecil
Fungsi kaedah String.intern():
Fungsinya adalah untuk masukkan rentetan secara manual ke dalam kolam malar
Atas ialah kandungan terperinci Apakah fungsi kaedah String.intern() dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!