Что такое "(что-то еще)" в выводе 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, изначально разрежены, но уплотнены сборщиком мусора.