2011-05-19 35 views
9

Ben String.substring kullanarak String.split ilgili hafıza sorunları ile tanınır bulundu. String.split kullanarak bir bellek sızıntısıJava String.split bellek sızıntısı?

var mı? evet bunun için-etrafında işin ne

ise? Aşağıdaki bağlantı, Java'daki alt dizinin doğru kullanıldığını gösterir.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4513622


alt dize mümkün MLK hakkında konuşmak Bir daha blog.

http://nflath.com/2009/07/the-dangers-of-stringsubstring/

+6

Ben ingilizce fark muhtemelen ilk dil değildir (Özellikle. String zaten özel sınıf Java dili özelliklerinin bir parçası olduğunu göz önünde bulundurarak), ancak bu soru anlamsızdır. Bize biraz bağlam verin lütfen. –

+0

Bu tür yaygın olarak kullanılan yöntemlerin, Java'nın eski sürümlerinden beri varolan bellek sızıntıları olduğunu düşünmüyorum. Ancak bir bellek sızıntısı bulduysanız, bazı bilgiler verin. –

+1

Bize bahsettiğiniz bilinen çalışma hakkında link verebilir misiniz? – jabal

cevap

12

Güncelleme: Davranış 1.7.0_06 değişti: bu makaleye bakın: java-performance.info de Changes to String internal representation made in Java 1.7.0_06.


olarak String.substring kullanırken etrafında gizlenen bir bellek sızıntısı aslında tür var @finnw tarafından dikkat çekti. nedeni String.substring sadece diğer bir deyişle, altta yatan dize bellekte tutulur verilen dize bir bölümü, bir görünümü döndürmesidir.

yeni dize oluşturulmasını zorlamak için, kaynağa ilgisiz, sen new anahtar kelime kullanmak gerekecek. Diğer bir deyişle, bu davranış bana "gereksiz" görünüyor söylemeliyim

String mySubstring = new String(orig.split(";")[i]); 

belki daha doğrudan, örneğin

String[] parts = orig.split(";"); 
//String mySubstring = parts[i];    // keeps orig from being GC'd 
String mySubstring = new String(parts[i]);  // creates a new string. 

veya yapmak gerekecek. Zayıf referanslar veya başka bir teknik kullanılarak çözülebilir olmalıdır.

+0

Teşekkürler, Ama split kullanarak herhangi bir sorun var mı? – Avinash

+0

Hayır. Eğer dizgileri çıkarırsanız, yeni String (...) 'i kullanmaya devam etmek istiyorsanız, gayet iyi olmalısınız. – aioobe

+1

Zayıf referansların kullanılmamasının sebebinin, çöp toplayıcısının uğraşması için pahalı olmaları olduğunu düşünüyorum.Bu, genellikle önemli bir optimizasyon olan bir şeyin bazen ters olduğu talihsiz durumlardan biridir. –