Как рассчитать соответствие объектов сборщику мусора в Java? - PullRequest
3 голосов
/ 26 апреля 2011

Пожалуйста, проясните мои сомнения.

class A{
Long weight = 1000L;
}
public class B extends A{
 public static void main (String[] args){
    B b = new B();
    B c = new B();
    b = null; 
    c = null;//going to gc.
 }
}

Здесь, в приведенном выше коде, при достижении "собирается в gc", сколько объектов имеют право на сборщик мусора? Насколько я знаю, args [], b, c и два объекта Long, всего 5, имеют право. Но некоторые говорят полностью 4. Они говорят, что в куче не будет создано двух длинных объектов, а только один.

Пожалуйста, проясните мои сомнения.

Ответы [ 6 ]

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

4 Объект [2 of B, 2 of Long] будет создан, и все 4 будут готовы для GC.

На линии

c = null;//going to gc.

будет прямая ссылка args, поэтому аргументы не будут готовы

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

В соответствии с разделом Спецификация языка Java 5.1.7 Преобразования в бокс:

Если значение p в боксе равно true, false, байт, символ в диапазоне \ u0000 до \ u007f, или int или короткий номер от -128 до 127, тогда пусть r1 и R2 быть результаты любых двух боксерских преобразований с. Это всегда случай, когда r1 является
такой же как r2.

Следовательно, это может быть верно только в том случае, если этот принцип применим и к длинному автобоксу объемом 1000 л, в противном случае - false.

Это может быть предпосылкой вопроса, но JLS, похоже, не включает в себя длинный автобокс, ни числа свыше 127,

Скорее всего, вы правы, а ваш спрашивающий неправ, насколько я понимаю.

Во всяком случае, я просто хотел указать, что рассматриваемый сценарий возможен с автобоксом при условиях, указанных в JLS. Условия по вашему вопросу не соответствуют требованиям, и поэтому я согласен с вашим количеством подсчитываемых объектов.

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

только 4 объекта имеют право на gc. в строке c = null; // собирается gc. установите точку останова и отладьте ваш код в eclipse, он покажет вам, сколько объектов будет создано.

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

Есть два Long объекта.Вы можете проверить, добавив эти строки, прежде чем установить b и c на null:

System.out.println(System.identityHashCode(b.weight));
System.out.println(System.identityHashCode(c.weight));

Вы получите два разных хэш-кода идентификаторов, означающих, что это два разных объекта.

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

Это немного сложно.

'b', 'c' - сборщик мусора. + 2

Поскольку значение веса находится за пределами диапазона [-128, 127], автобокс назначит новые экземпляры Long для каждого 'A' + 2 (см. http://www.jdocs.com/harmony/5.M5/java/lang/Long.html#823)

Если вы вызывали B.main с использованием какого-либо механизма отражения и не содержали ссылок на класс B или его экземпляры метода и т. Д., То класс A, класс B вместе со всеми экземплярами метода и т. Д. + a_bunch

Если invoker не использует переданный массив args, то args; + 1

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

Ну, если b.weight == c.weight, то ответ 4. В противном случае ответ 5. Попробуйте и посмотрите.

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