Подходят ли интернированные константы для 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. Но каждый класс ссылается на свой загрузчик классов и ссылается на него. Обычно вас не интересуют загрузчики классов, так как вы используете загрузчик по умолчанию, и он (и все ваши классы) остаются до конца.
Некоторое приложение (например, веб-серверы) должно иметь возможность загружать и выгружать некоторый код (например, сервлет) динамически. Вот где привыкли к загрузчикам классов.