Обновление: Поведение изменилось в 1.7.0_06: см. Эту статью: Изменения внутреннего представления String сделаны в Java 1.7.0_06 на java-performance.info.
Как указывает @ finnw , при использовании String.substring
действительно происходит утечка памяти. Причина в том, что String.substring
возвращает только представление части данной строки, то есть основная строка все еще хранится в памяти .
Чтобы принудительно создать новую строку, не связанную с источником, вам нужно использовать ключевое слово new
. То есть, вам придется сделать, например,
String[] parts = orig.split(";");
//String mySubstring = parts[i]; // keeps orig from being GC'd
String mySubstring = new String(parts[i]); // creates a new string.
или, возможно, более прямой
String mySubstring = new String(orig.split(";")[i]);
Я должен сказать, что это поведение кажется мне "ненужным". Это должно быть решаемо с использованием слабых ссылок или какой-либо другой техники. (Особенно учитывая, что String
уже является специальным классом, частью спецификации языка Java.)