Сбор мусора и струны

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

Они живут в куче или в пуле строк?

И если на куче, то они будут собирать мусор, если они недоступны какой-либо живой нитью.

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

Ответы

Ответ 1

String s = new String("abc");

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

Ответ 2

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

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

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

См. также: интернированные строки: Java Glossary

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

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

Ответ 3

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

PS: Литеральный пул также находится в куче.

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

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

String name3 = new String("John");
String name4 = new String("John");