Сборка мусора и строк - PullRequest
       11

Сборка мусора и строк

5 голосов
/ 04 февраля 2010

У меня есть некоторые сомнения относительно строк

Они живут в пуле Heap или String?

А если в Heap, то они будут собирать мусор, если они недоступны ни одному живому потоку.

А если в пуле строк, то как они будут удалены или удалены, потому что, как мы знаем, сборка мусора происходит только в куче.

Ответы [ 3 ]

8 голосов
/ 04 февраля 2010
String s = new String("abc");

строковый объект, на который ссылается s, будет в куче, а строковый литерал "abc" будет в пуле строк. Объекты в пуле строк не будут собираться мусором. Они предназначены для повторного использования в течение всей жизни программы для повышения производительности.

5 голосов
/ 04 февраля 2010

Все они хранятся в куче, но intern() строки ed (включая строковые литералы в источнике) имеют ссылку из пула в классе String.

Если они отображаются в виде литералов в исходном коде, включая константные строковые выражения (например, "a" + "b"), то на них также будут ссылаться из Class, в котором они появляются, что обычно означает, что они будут работать до тех пор, пока выполняется процесс .

Редактировать : Когда вы вызываете intern() для строки в вашем коде, она также добавляется в этот пул, но поскольку она использует слабые ссылки, строка может все еще подвергаться сборке мусора, если она больше не используется.

Смотрите также: строки: Java Глоссарий

Цитата из этой статьи:

Коллекция строк, зарегистрированных в этой HashMap, иногда называется пулом строк. Тем не менее, они являются обычными объектами и живут в куче, как и любые другие (возможно, оптимизированным способом, поскольку интернированные строки имеют тенденцию быть долгоживущими).

1 голос
/ 04 февраля 2010

String Alex входит в пул литералов и остается там до тех пор, пока процесс запускается (или веб-приложение остается загруженным), как сказано в finnw , и никогда не собирается сборщиком мусора. Строка name2 не выделяет память для "Alex" и повторно использует ее из литерального пула.

PS: Буквальный пул тоже в куче.

Для строки Джон создаются два объекта со ссылками name3 и name4, которые можно собирать мусором.

String name = "Alex";
String name2 = "Alex";

String name3 = new String("John");
String name4 = new String("John");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...