Dize değişmezleri yığında depolanmaz. Asla. Aslında, yığın üzerinde hiçbir nesne depolanmaz.
(Veya daha doğru bir şekilde, onları temsil String nesneleri) dize hazır olan tarihi bir yığın içinde saklanmıştır "PermGen" yığın olarak adlandırılan. (Permgen, kalıcı üretimin kısaltmasıdır.)
Normal koşullar altında, String değişmezleri ve permgen yığınındaki diğer şeylerin çoğu "kalıcı olarak" erişilebilirdir ve çöp olarak toplanmaz. (Örneğin, String değişmez değerlerine, onları kullanan kod nesnelerinden her zaman erişilebilir.) Bununla birlikte, artık gerekli olmayan dinamik olarak yüklenmiş sınıfları bulmaya ve toplamaya çalışmak için bir JVM yapılandırabilirsiniz ve bu, String değişmez değerlerinin çöp olarak toplanmasına neden olabilir. .
AÇIKLAMA # 1 - Permgen'in GC'ye tabi tutulmadığını söylemiyorum. Genellikle JVM bir Tam GC çalıştırmaya karar verdiğinde yapar. Demek istediğim , String değişmez değerlerine , onları kullanan kod erişilebilir olduğu sürece erişilebilir olacak ve kodun sınıf yükleyicisi erişilebilir olduğu sürece koda erişilebilir olacak ve varsayılan sınıf yükleyiciler için bu "sonsuza kadar" anlamına geliyor.
AÇIKLAMA # 2 - Aslında, Java 7 ve sonrası, dizi havuzunu tutmak için normal öbek kullanır. Böylece, String değişmezlerini ve stajyer dizeleri temsil eden String nesneleri aslında normal yığın içindedir. (Ayrıntılar için @ assylias'ın Yanıtı'na bakın.)
Ama hala dize değişmezinin depolanması ile oluşturulan dize arasındaki ince çizgiyi bulmaya çalışıyorum new
.
"İnce çizgi" yoktur. Gerçekten çok basit:
String
Dize değişmezlerini temsil eden / bunlara karşılık gelen nesneler dize havuzunda tutulur.
String
bir String::intern
çağrı tarafından oluşturulan nesneler dize havuzunda tutulur.
- Diğer tüm
String
nesneler dizi havuzunda TUTULMAZ.
Sonra, string havuzunun nerede "depolandığı" ile ilgili ayrı bir soru var. Java 7'den önce permgen yığınıydı. Java 7'den itibaren ana yığındır.