Что такое "(что-то еще)" в выводе jol GraphLayout?

При использовании класса GraphLayout jol для печати графа объектов, на которые ссылается экземпляр объекта, некоторые выходные записи говорят "(что-то еще)" вместо типа и ссылочного пути. Например, рассмотрим следующий код, который печатает график списка из 20 случайных целочисленных объектов:

List<Integer> foo = new Random().ints(20).boxed().collect(Collectors.toList());
System.out.println(GraphLayout.parseInstance(foo).toPrintable());

Этот код печатает:

java.util.ArrayList object externals:
          ADDRESS       SIZE TYPE                PATH                           VALUE
         d642ecc8         24 java.util.ArrayList                                (object)
         d642ece0         16 java.lang.Integer   .elementData[0]                212716192
         d642ecf0         56 (something else)    (somewhere else)               (something else)
         d642ed28         16 java.lang.Integer   .elementData[1]                1503736768
         d642ed38         16 java.lang.Integer   .elementData[2]                -2099759732
         d642ed48         16 java.lang.Integer   .elementData[3]                445566433
         d642ed58         16 java.lang.Integer   .elementData[4]                -1528625708
         d642ed68         16 java.lang.Integer   .elementData[5]                -555424299
         d642ed78         16 java.lang.Integer   .elementData[6]                1607595284
         d642ed88         16 java.lang.Integer   .elementData[7]                763466772
         d642ed98         16 java.lang.Integer   .elementData[8]                638331919
         d642eda8         16 java.lang.Integer   .elementData[9]                -1742026575
         d642edb8         16 java.lang.Integer   .elementData[10]               1920101909
         d642edc8         80 (something else)    (somewhere else)               (something else)
         d642ee18         16 java.lang.Integer   .elementData[11]               2001035318
         d642ee28         16 java.lang.Integer   .elementData[12]               -1920666937
         d642ee38         16 java.lang.Integer   .elementData[13]               -991335829
         d642ee48         16 java.lang.Integer   .elementData[14]               -47760298
         d642ee58         16 java.lang.Integer   .elementData[15]               855824902
         d642ee68        104 [Ljava.lang.Object; .elementData                   [212716192, 1503736768, -2099759732, 445566433, -1528625708, -555424299, 1607595284, 763466772, 638331919, -1742026575, 1920101909, 2001035318, -1920666937, -991335829, -47760298, 855824902, 2137884845, -226328690, 1472718384, 890105604, null, null]
         d642eed0         16 java.lang.Integer   .elementData[16]               2137884845
         d642eee0         16 java.lang.Integer   .elementData[17]               -226328690
         d642eef0         16 java.lang.Integer   .elementData[18]               1472718384
         d642ef00         16 java.lang.Integer   .elementData[19]               890105604

В поисках jol "something else" на DuckDuckGo и Google не вернули никаких полезных хитов.

Что представляют собой записи ((что-то еще))?

1 ответ

Решение

"(что-то еще)" означает только то, что не является частью этого графа объектов. Там могут быть другие (живые или мусорные) объекты или просто пробел в куче по какой-то внутренней причине VM.

Обратите внимание, что таблица объектов в графе отсортирована по адресу. ArrayList's elementData массив лениво инициализируется при добавлении первого элемента и при добавлении десятого элемента в список, elementData перераспределен, чтобы освободить место для большего количества элементов. Это создает пробелы в области кучи, соответствующей (теперь мусорным) массивам, и jol печатает их как "(что-то еще)" записи. Код, ответственный за печать этих записей, - строка 246 GraphLayout (по крайней мере, на момент публикации).

jol выводит эту информацию о пробелах в куче, чтобы помочь понять поведение сборщика мусора. Некоторые из более поздних примеров jol демонстрируют это, например, пример сжатия, который показывает, как объекты, на которые ссылаются из ArrayList, изначально разрежены, но уплотнены сборщиком мусора.

Другие вопросы по тегам