2014-09-19 3 views
3

Этот фрагмент кода из книги. Вопрос заключается в том,Сбор мусора Java 5

  1. сколько объектов создано
  2. сколько объектов имеют право на дс, когда линия // действительно достигнут материал.

Ответов, согласно книге, являются 5 и 2. Вот код:

class Dozens { 
    int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12}; 
    } 

public class Eggs{ 
    public static void main(String[] args){ 
     Dozens[] da = new Dozens[3]; 
     da[0] = new Dozens(); 
     Dozens d = new Dozens(); 
     da[1] = d; 
     d = null; 
     da[1] = null; 
     // do stuff 
    } 
} 

В ответ на первый вопрос, вы также подсчитывать ИНТ [] объект йга в виде не дополнительный объект каждый раз, когда вы создаете дюжины?

Аналогично, когда вы достигаете // делаете что-нибудь, при вычислении количества объектов, имеющих право на gc, для каждого объекта Dozens, вы также считаете объект int [] dz, содержащийся в нем?

Я не сосчитать ИНТ [] дг объектов, и пришли к ответам 5 и 3.

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

Спасибо.

+0

Не забывайте, что объект массива создается для хранения (возможно пустых) аргументов командной строки, переданных методу 'main', и объекта String для хранения каждого аргумента командной строки (если есть). – Bobulous

ответ

4

Я комментировал приведенный ниже код комментариями, чтобы выделить, где ссылки создаются или теряются.

При подсчете распределений необходимо включить выделение массива, хранящегося в поле dz. Мое подозрение заключается в том, что вы подсчитали назначение ссылок объектов на da [0] и da [1] в качестве распределений. Поскольку они копируют ссылку и не, создавая новый объект; они влияют только на то, когда объекты могут стать GCable и не создавать новый объект.

class Dozens { 
    int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12}; 
} 

public class Eggs{ 
    public static void main(String[] args){ 
     Dozens[] da = new Dozens[3]; // +1 object, the array containing 3 nulls 
     da[0] = new Dozens();   // +2 objects, Dozens and the array in Dozens.dz 
     Dozens d = new Dozens();  // +2 objects, Dozens and the array in Dozens.dz 
     da[1] = d;     // +0, d now has two refs to it 
     d = null;      // +0, d now has one ref to it 
     da[1] = null;     // -2, d now has no refs to it so both d and its internal array become available for GC 
     // do stuff 
    } 
} 

Суммирование итоговых значений дает, 1 + 2 + 2 = 5 ассигнований. -2 в конце делает вывод о том, что для GC стали доступны 2 объекта

+0

Большое спасибо за отличное объяснение. Он прояснил некоторые заблуждения, которые у меня были. Еще раз спасибо. – user3516726

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