Подходят ли интернированные константы для GC?

Цитирую эту страницу:

Сколько объектов будет подходить для GC здесь?

String s = "hello";
Character ch1 = 1;
Character ch2 = 1;
ch1 = null;
s = null; 

Я считаю, что ответ 1.

Я хотел бы понять, как это работает в Java 6.

Мое понимание на данный момент:

Строка идет в бассейн. Позже нет ссылки на это. Итак, согласно этому ответу (я не понимаю эту часть о загрузчике классов, вы можете это уточнить?), Пул строк, скорее всего, не будет собирать мусор...

Хорошо, персонажи. В Java есть такая оптимизация, которая ch1 а также ch2 укажет тот же объект. Итак, эти маленькие персонажи тоже собираются в какой-то пул. Но, несмотря на ch1 является nullмы все еще можем получить доступ 1 с ch2 ссылка.

Итак, мой ответ на данный момент будет 0.

Прав ли я на каждом шагу? Если нет, пожалуйста, поправьте меня. Не могли бы вы объяснить, как это работает?

1 ответ

Ваш ответ "ничего не собирается" верен, по крайней мере, пока класс, определяющий строку, находится вокруг.

"hello" является строковым литералом, и класс, в котором он появляется, ссылается на него. Пока класс достижим, буквальный остается.

Класс тоже может быть GC'd. Но каждый класс ссылается на свой загрузчик классов и ссылается на него. Обычно вас не интересуют загрузчики классов, так как вы используете загрузчик по умолчанию, и он (и все ваши классы) остаются до конца.

Некоторое приложение (например, веб-серверы) должно иметь возможность загружать и выгружать некоторый код (например, сервлет) динамически. Вот где привыкли к загрузчикам классов.

Другие вопросы по тегам