2014-12-03 2 views
0

Цитирование this страницы:Являются ли интернированные константы подходящими для GC?

Сколько объектов будет иметь право на GC здесь?

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

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

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

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

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

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

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

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

ответ

3

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

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

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

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

Смежные вопросы