@MishaXXL

По какому принципу работает очистка памяти в String Pool?

Если я правильно понял работу String Pool, то при каждом создании экземпляра класса String, мы в String Pool выделяем память под это значение.
Но у String есть операция конкатенации и при присвоении уже существующей
String str = "Hello"
мы добавляем
str += " Java"
то у нас первое значение в String Pool не удаляется из памяти и просто висит, а strсоздает еще одну запись и ссылается на последнее значение

В какой момент сборщик мусора решает очистить наш String Pool от лишних значений и почему он это делает не так быстро, что конкатенации строки считается дурным тоном?
  • Вопрос задан
  • 104 просмотра
Решения вопроса 2
@Dementor
программист, архитектор, аналитик
str создает еще одну запись и ссылается на последнее значение

Зануда мод: не переменная что-то создает, а JVM помещает новую строку в пул, если использовать создание строки литералом, а не конструктором. А потом ссылку на выделенную область памяти помещает в str

В какой момент сборщик мусора решает очистить наш String Pool от лишних значений и почему он это делает не так быстро, что конкатенации строки считается дурным тоном?

До Java 6 String Pool жили в отдельной области памяти, которую GC не чистят (т.е. единожды объявленная строка жила до завершения программы, даже без ссылок). Начиная с 7-ки пулл перенесли в основную кучу, где его может почистить GC. Не не забываем, что и сам гарбадж коллектор не сферический конь, а имеет с десяток реализаций, в каждой из которых есть свои настройки - не копал эту тему, но подозреваю, что можно настроить "неприкосновенность" String Pool даже в общей куче (но зачем?)

Вторая часть вопроса бессмысленна. Забудь про строки. Пусть у тебя есть некий класс А. Твой вопрос эквивалентен следующему: Почему считается дурным тоном создавать множественные объекты класса А и каждый из них присваивать в одну и ту же переменную? Это медленно и расточительно к ресурсам!

Upd. Тут подробнее: https://topjava.ru/blog/rukovodstvo-po-string-pool...
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Дурным тоном считается создавать работу для сборщика мусора, как бы быстр он ни был, его работа потребляет ресурсы, которые не безграничны и стоят денег.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы