• Объекты Java
    +17
    По-моему, это и есть гадание. Один «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, уплотнение полей не применяется.