Какие объекты имеют право на GC? - PullRequest
4 голосов
/ 08 сентября 2010
class CardBoard {
  Short story = 200;
  CardBoard go(CardBoard cb) {
    cb = null;
    return cb;
  }
  public static void main(String[] args) {
    CardBoard c1 = new CardBoard();
    CardBoard c2 = new CardBoard();
    CardBoard c3 = c1.go(c2);
     System.out.println("c3 value : "+c3);
     c1 = null;
     System.out.println("c1 value : "+c1);
     System.out.println("c2 value : "+c2);
    // do Stuff
  } 
}

Это пример из пробного экзамена SCJP6.Вопрос гласит: когда достигается // doStuff, сколько объектов подходит для GC?И ответ - (2 объекта), потому что: только один объект CardBoard (c1) является приемлемым, но у него есть связанный объект Short wrapper, который также имеет право.указывает на ноль ... поэтому я бы сказал, что 3 объекта имеют право на GC.

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

Ответы [ 4 ]

10 голосов
/ 08 сентября 2010

Объект c3 изначально нулевой, поэтому нет никаких сомнений в том, чтобы вспомнить его, потому что он никогда не существовал в первую очередь. Сборщик мусора предназначен для очистки объектов, которые действительно существуют в куче.

Среди прочего, ссылка на c2 никогда не отбрасывается, и, следовательно, она не будет исправлена. Хотя кажется, что c2 обнуляется в операторе CardBoard c3 = c1.go(c2);, это не так. Ссылка на c2 передана по значению, и хотя ссылка аннулирована, в основном методе существует ссылка на объект. Следовательно, он не будет исправлен.

Это оставляет нам c1, который был явно аннулирован и, следовательно, имеет право на сбор. Однако c1 также содержит ссылку на историю переменных Short, которая не имеет никаких входящих ссылок от какого-либо другого объекта. Это приводит к тому, что два объекта пригодны для очистки - один объект CardBoard и встроенный объект Short.

2 голосов
/ 08 сентября 2010

CardBoard c1 = new CardBoard ();

Создает экземпляр CardBoard и его экземпляр Short.(2 объекта) Назначает ссылку CardBoard на c1.

CardBoard c2 = new CardBoard ();

Создает другой экземпляр CardBoard и его Short экземпляр.(Еще 2 объекта) Назначение ссылки CardBoard на c2.

CardBoard c3 = c1.go (c2);

Назначение null для c3.(Метод go - это хитрость, позволяющая понять, понимаете ли вы семантику передачи аргументов Java. Если вы считаете, что Java использует передачу по ссылке, вы можете ошибочно заключить, что этим вызовом для c2 установлено значение null.Фактически, c2 не изменяется.)

c1 = null;

Назначает null для c1.Это делает первый экземпляр CardBoard и его экземпляр Short недоступными, а также кандидатов на сборку мусора.

Второй экземпляр CardBoard и его экземпляр Short все еще доступны.

1 голос
/ 08 сентября 2010

c3 никогда не указывает на какой-либо объект, это всегда нулевая переменная. Следовательно, объект c3 не подходит для GC

0 голосов
/ 08 сентября 2010

В вашем коде только G1 и story (Short), содержащиеся в C1, имеют право на GC. т.е. 2 объекта.

C3 никогда не ссылается на какой-либо объект, так как метод go () возвращает нуль.

c2 не подходит для GC.Как и в методе Java, аргументы передаются по значению.и когда вызывается метод go, c2 продолжает указывать на объект, хотя в методе go переданная переменная присваивается значение null.

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