2010-02-04 3 views
5

У меня есть некоторые сомнения относительно СтрокиСбор мусора и стружки

Живы ли они на Куче или Стручном бассейне?

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

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

ответ

8
String s = new String("abc"); 

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

+0

Если вы имеете в виде _constant pool_, которая является частью определения класса, то вы _can_ выгрузить постоянный пул, при условии, вы можете выгрузить класс (который обычно требует разыменования загрузчика класса и все ссылки на это нагруженное классы). Более сложно, чем ваша типичная программа, но Tomcat делает это. –

4

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

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

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

Смотрите также: interned Strings : Java Glossary

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

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

0

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

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

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

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

String name3 = new String("John"); 
String name4 = new String("John"); 
Смежные вопросы