2013-12-19 5 views
0

Этот вопрос взят из SCJP. Нам нужно найти объекты, которые имеют право на сбор мусора. Ответ гласит c3 и рассказ. Мне нужно знать, почему его короткая история подходит для GC. Это фактически переменная экземпляра. Означает ли это, если я не использую переменные экземпляра, они имеют право на сбор мусора?Почему объект-обертка подходит для сбора мусора?

Фактический ответ в соответствии с книгой: имеет право только один объект CardBoard (c1), но имеет соответствующий объект Short wrapper, который также имеет право на участие. Таким образом, «два» объекта имеют право на участие.

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

Что бы вы ожидали от экземпляра «Short», если экземпляр «CardBoard» GCed? – arshajii

+0

Яа это то, что я думаю, что произойдет с коротким, если C1 мусор? – user2985842

ответ

0

Ответ не говорит c3 он говорит c1 и, таким образом Short story она содержит. Это связано с линией

c1 = null; 

В этот момент объект, который ссылается c1 может быть GCed и, таким образом, любой объект, это относится к.

+2

@ElliottFrisch: c3 никогда не было ничего, кроме нулевого. – falstro

+0

@ElliottFrisch Но нет объекта, который становится невозможен. Сбор мусора происходит по экземплярам, ​​а не по переменным, которые (больше не содержат). – chrylis

+0

@roe Хорошая добыча, вы правы. Это никогда не создавалось. –

1

Если ничто не относится к c1, тогда поле Short story = 200; (принадлежащее к экземпляру c1) также имеет право на сбор.

3

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

Хотя c1 ссылается на свой объект story, нет никакого способа достичь ни одного, поэтому они оба имеют право на участие.

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

+0

НО ПОЧЕМУ СКАЖЕТСЯ «связанный объект короткой обертки, который также имеет право»? ЧТО ЭТО ЗНАЧИТ? – user2985842

+0

@ user2985842; не нужно кричать. Это означает, что объект, на который ссылается переменная 'c1', в свою очередь ссылается на объект типа« Short »(называемый оберточным объектом, поскольку он только обертывает примитивное значение и не имеет другой цели, кроме того, что позволяет использовать его как объект) , и, хотя на него ссылаются, он больше недоступен и, следовательно, имеет право на сбор мусора. Если это «связанная» часть, которая отключает вас, вам нужно еще раз взглянуть на объекты и классы, каждый экземпляр объекта «CardBoard» имеет (по определению класса) ссылку на объект «Short» через поле «история» , – falstro

+0

Извините, я кричал ... Я не имел в виду ... Я получил ответ на ур ... спасибо – user2985842

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