Относительно пула строковых объектов в PermGC - PullRequest
0 голосов
/ 16 ноября 2011

Я слышал, что в PermGC существует пул строковых объектов, и когда исполняется строковый специалист, он сначала проверяет пул, чтобы увидеть, существует ли эквивалентный строковый объект, если он не существует, он создает его и возвращает ссылку на объединенный экземпляр.

Но вот мой первый вопрос.

Я думаю, что объект создается в куче, особенно в молодом поколении в первую очередь. Если он выживает во время нескольких сборок мусора, он переходит к старому поколению. Кто-нибудь может объяснить, как строковый объект попадает в пул, существующий в Пермском ГК?

второй вопрос:

String s = "test"; s = "test1";

Если я переназначу «test1» на ссылку s и продолжу использовать «test1», значит ли это, что «test» (созданный в молодом поколении) будет собирать мусор?

третий вопрос: Как пул строковых объектов связан с пулом констант времени выполнения?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

С чего вы взяли, что интернированный String первым идет молодому поколению?Метод String#intern() является нативным.Конечно, для реализации очень возможно переместить ее прямо в permgen.

Второй вопрос: если нет других ссылок на этот экземпляр "test" String, он подходит для сборки мусора.Та же история, если она интернирована.Даже внутренняя строка, у которой больше нет активных ссылок, может быть собрана сборщиком мусора.Впрочем, этого не могло быть в старых JVM.И это может зависеть от реализации, я думаю.

Что касается третьего вопроса, я не знаю.Все, что я знаю, это то, что строковые литералы из исходного кода помещаются в один и тот же пул.Если бы вы должны были создать String, равную константе String из источника, а затем интернировать ее, вам был бы возвращен экземпляр, который использовался для представления константы.Думайте об этом как о строковых литералах, которые были интернированы сразу.

РЕДАКТИРОВАТЬ: просто прочитайте ваши первые несколько предложений снова, и я думаю, что вижу причину путаницыКогда вы вызываете intern() для String, и в пуле еще нет равных String, тогда сначала не будет построена эквивалентная String.Он просто переместит экземпляр, который вы назвали intern(), в пул, а не вернет новую ссылку. Так сказано в JavaDoc .

0 голосов
/ 16 ноября 2011

Строки отправляются в пул интернов в двух случаях:

  • вы явно вызываете метод intern () для объекта String
  • вы инициализируете его литералом (вы даете явное содержимое строки), поскольку Java автоматически интернирует строковые литералы.

Пул организован в виде таблицы, после интернирования строки он добавляется в пул, если значение еще не существует, в противном случае используется ссылка на существующую запись.

"test" в вашем случае должен идти в пул, а не в молодое пространство, в любом случае там также выполняется очистка строк, на которые нет ссылок (я не могу сказать, является ли он частью того же процесса GC, который используется для кучи, ни если это поведение является стандартным)

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