Утечка памяти в Java String.split? - PullRequest
9 голосов
/ 19 мая 2011

Я обнаружил, что использование String.substring известно о проблемах с памятью, связанных с String.split.

Есть ли утечка памяти при использовании String.split?

Если да, то какова работадля этого?


Следующая ссылка показывает правильное использование подстроки в Java.

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


Еще один блог, в котором говорится о возможной MLKв подстроке.

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

1 Ответ

12 голосов
/ 19 мая 2011

Обновление: Поведение изменилось в 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...