Сбор мусора и струны
У меня есть некоторые сомнения относительно строк
Они живут в куче или в пуле строк?
И если на куче, то они будут собирать мусор, если они недоступны какой-либо живой нитью.
И если в 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");