подсчитать количество объектов, подходящих для GC

Добрый вечер, посмотрите на эти примеры кода, которые демонстрируют количество объектов, подходящих для GC:

public class CardBoard {

Short story = 5;

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);
    c1 = null;
   // do Stuff

   }
}

я вижу, что есть четыре объекта, которые подходят для GC, когда достигается do Stuff, это c3 и связанный с ним объект истории и c1 и связанный с ним объект истории, что вы видите?


person Java Player    schedule 12.01.2013    source источник
comment
...у нас интервью? :-)   -  person radai    schedule 12.01.2013
comment
точный дубликат: stackoverflow.com/questions/13109717 /   -  person BartoszMiller    schedule 12.01.2013


Ответы (1)


Существует ровно 1 объект, подходящий для GC — тот, на который ранее ссылался c1. c3 указывает на null (CardBoard.go() всегда возвращает null).

Также помните, что переменные c1 и c2 являются только ссылками, а не объектами. Таким образом, они не нуждаются в сборке мусора. Они живут в стеке, а не в куче.

Наконец, не дайте себя обмануть:

CardBoard go(CardBoard cb) {
  cb = null;
  return cb;
}

это аннулирует только ссылку cb (параметр), а не ссылку c2.


Short story = 5;

это отдельная загвоздка. Если бы это было short story, то это не считалось бы отдельным объектом. Но Short — это объект, поэтому технически CardBoard указывает на другой объект, подходящий для GC. Однако! Из-за кэширования примитивных оболочек 5 фактически является частью статического кеша Short и никогда не подходит для GC. Другими словами, на объект типа Short, представляющий 5, всегда ссылается кэш static в Short.

А вот и лучшая часть. Если бы это было:

Short story = 5000;

тогда ответ будет... 2. Это потому, что Short.valueOf((short)5000) всегда возвращает новый экземпляр Short (подходящий для GC), а Short.valueOf(5) всегда возвращает один и тот же экземпляр.

Вау, это было сложно!

person Tomasz Nurkiewicz    schedule 12.01.2013
comment
совсем забыл про этот кеш. снимаю перед вами шляпу. - person radai; 12.01.2013
comment
когда вы говорите - тот, на который ранее ссылался c1, что это значит? - person Imposter; 14.01.2013
comment
@Imposter: В первой строке вы видите: c1 = new CardBoard(), а в конце c1 = null. new CardBoard() имеет право на GC. - person Tomasz Nurkiewicz; 14.01.2013
comment
подскажите пожалуйста про статический кеш, я не понимаю разницы между Short story=5 и Short story=5000; - person Java Player; 02.02.2013
comment
@Eslam: пожалуйста, откройте другой вопрос или лучше - исследуйте. Это обсуждалось много раз и также является частью экзамена OCJP. - person Tomasz Nurkiewicz; 02.02.2013