Pull to refresh
153
0
Громов Андрей @rjhdby

И то и сё

Send message
По-моему, это и есть гадание. Один «magic» чего стоит. Правдивую информацию можно почерпнуть в исходниках, благо, что открытые.

Заголовок Java-объекта, действительно, состоит из 2х слов.
Первое — markOop — многофункциональное хранилище разнообразной информации об объекте.
В зависимости от ситуации может содержать
— хеш-код объекта;
— возраст (количество пережитых GC);
— lock (обычный, рекурсивный или biased).
Подробное описание с побитовыми схемами — в комментариях к markOop.hpp.

Второе слово — указатель на класс. Но не тот, который java.lang.Class, а klassOop — нативное описание типа объекта. Что из себя представляет Klass, можно вычитать, опять же, в комментариях к klass.hpp. В частности, Klass содержит и java_mirror — ссылку на java.lang.Class.

У массивов сразу за этими двумя словами заголовка идет 32-битная длина массива — см. arrayOop.hpp.

Что касается полей объекта, они переупорядочиваются для экономии занимаемого места с учетом выравнивания. long и double поля должны быть выровнены по 64-битной границе, int и float — по 32-битной, short и char — по 16-битной, а затем уже и byte с boolean. Для некоторых системных классов (например, String, Throwable, Reference), с которыми тесно взаимодействует VM, уплотнение полей не применяется.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Works in
Registered
Activity