Literal string tidak disimpan di tumpukan. Tidak pernah. Faktanya, tidak ada objek yang disimpan di tumpukan.
Literal string (atau lebih tepatnya, objek String yang mewakilinya) secara historis disimpan dalam Heap yang disebut heap "permgen". (Permgen adalah kependekan dari generasi permanen.)
Dalam keadaan normal, literal String dan banyak hal lainnya di heap permgen dapat dijangkau "secara permanen", dan tidak dikumpulkan dari sampah. (Misalnya, string literal selalu dapat dijangkau dari objek kode yang menggunakannya.) Namun, Anda dapat mengonfigurasi JVM untuk mencoba menemukan dan mengumpulkan kelas yang dimuat secara dinamis yang tidak lagi diperlukan, dan ini dapat menyebabkan literal String menjadi sampah yang dikumpulkan .
KLARIFIKASI # 1 - Saya tidak mengatakan bahwa Permgen tidak mendapatkan GC'ed. Ya, biasanya ketika JVM memutuskan untuk menjalankan GC Penuh. Maksud saya adalah bahwa string literal akan dapat dijangkau selama kode yang menggunakannya dapat dijangkau, dan kode akan dapat dijangkau selama classloader kode tersebut dapat dijangkau, dan untuk classloader default, itu berarti "selamanya".
KLARIFIKASI # 2 - Faktanya, Java 7 dan yang lebih baru menggunakan heap biasa untuk menampung kumpulan string. Jadi, objek String yang mewakili literal String dan string internal sebenarnya berada di heap reguler. (Lihat Jawaban @ assylias untuk detailnya.)
Tetapi saya masih mencoba mencari garis tipis antara penyimpanan string literal dan string yang dibuat dengan new
.
Tidak ada "garis tipis". Ini sangat sederhana:
String
objek yang mewakili / sesuai dengan literal string disimpan di kumpulan string.
String
objek yang dibuat oleh String::intern
panggilan ditahan di kumpulan string.
- Semua
String
objek lain TIDAK diadakan di kumpulan string.
Lalu ada pertanyaan terpisah di mana kumpulan string "disimpan". Sebelum Java 7 itu adalah permgen heap. Dari Java 7 dan seterusnya, ini adalah heap utama.