Вопрос про GC - PullRequest
       37

Вопрос про GC

4 голосов
/ 26 апреля 2010

Это квест, взятый из экзамена Java,

Сколько объектов подходит для сбора габарита на # 1?

public class Main   {

Integer x = 32768;
public static void main(String[] args)
{ 
    Main m = new Main();
    m = null;
    // #1
  } 
}

Я думал, что он просто собирает Integer x, GC даже собирает Главный объект m?

Ответы [ 6 ]

5 голосов
/ 26 апреля 2010

Да, он собирает Главный объект. Поскольку целое число само по себе не является отдельным объектом (он является членом Main) и не является указателем, оно не будет собираться отдельно, а только как часть Main.

3 голосов
/ 26 апреля 2010

Сборщик мусора может удалить два объекта.

Объект, назначенный для m, более недоступен, равно как и Integer внутри Main.

Редактировать: Вы можете спросить себя: "Возможно ли, что я получу доступ к объекту каким-либо образом в этой точке?" Если ответ «Нет», сборщик мусора может удалить его.

2 голосов
/ 26 апреля 2010

Единственное недоразумение, которое вы можете испытывать, заключается в том, что основной метод может вызываться, даже если главный объект не существует. Это потому, что это статический метод. Точно так же «Integer x» существует только как поле в главном объекте. Поэтому, когда вы создаете новый главный объект m, вы также создаете целое число m.x как часть m. Затем, когда вы устанавливаете m в null, объект, на который ранее ссылался m, является мусором и может быть собран.

Теперь, когда он будет собран, это совершенно другой вопрос. Там действительно нет никаких гарантий; однако, поскольку его использование было настолько локализовано, об этом почти наверняка позаботятся в следующей незначительной терминологии collection / scavenge / pick-your-favourite.

1 голос
/ 26 апреля 2010

Может. Больше нет ссылок на него, поэтому он может быть использован для сборки мусора.

0 голосов
/ 27 апреля 2010

Мои наблюдения с использованием недавнего OpenJDK показали, что только после выхода из метода любые ссылки, которые он потерял, действительно собираются. Я не ожидал этого вообще, но это то, что случилось. Извлечение этих строк кода в другой метод, который затем возвращал бы к main (), did позволял собирать экземпляр.

Я думаю, что это глупый вопрос. (РЕДАКТИРОВАТЬ: я имею в виду вопрос об экзамене! Не оскорблять подателя!) Это все в том, как вы определяете «право». В моем случае, я бы сказал, что после того, как не осталось никаких ссылок, экземпляр был приемлемый для сбора, просто он никогда не будет быть собранным до тех пор, пока метод не вернется .

0 голосов
/ 26 апреля 2010

Экземпляр Main имеет право на сборку мусора, а обычно Целое число также будет иметь право. Но экземпляр Integer также может кэшироваться классом Integer, если он настроен для этого (см. этот ответ ).

Обычно при использовании кешируются только целые числа от -128 до 127 * Integer # valueOf (int) (используется для автобоксирования), но верхний предел можно увеличить, установив системное свойство java.lang.Integer.IntegerCache.high

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...