Что такое "(что-то еще)" в jol GraphLayout output?
При использовании класса jol GraphLayout для печати графика объектов, ссылающихся на экземпляр объекта, некоторые из выходных записей говорят "(что-то еще" "вместо типа и ссылочного пути. Например, рассмотрим следующий код, который печатает график списка из 20 случайных объектов Integer:
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 elementData
лениво инициализируется при добавлении первого элемента, и когда десятый элемент добавляется в список, elementData
перераспределяется, чтобы освободить место для большего количества элементов. Это создает промежутки в области кучи, соответствующие массивам (теперь-мусор), и jol печатает их как записи "(что-то еще)". Код, ответственный за печать этих записей, GraphLayout строка 246 (по крайней мере, с этой публикации).
jol печатает эту информацию о разрыве кучи, чтобы помочь понять поведение сборщика мусора. Некоторые из более поздних jol примеров демонстрируют это, например, пример уплотнения показывает, как объекты, ссылающиеся на ArrayList, изначально разрежены, но уплотняются сборщиком мусора.