Заголовок объекта Java

Java

1. Введение

  • Заголовок java-объекта очень важен: Synchronize, GC, HashCode,biadLock и ObjectMonitor — все они поднимают шум вокруг заголовка объекта.

  • На самом деле можно сказать, что вся Java построена на системе oop-klass.Я думаю, все многое знают из различных технических блогов и книг. Но в основном они все под 32-битными виртуальными машинами.Может у Чжоу Чжимина слишком много учебных заметок.

  • В этой статье речь не идет о системе oop-klass (ограниченные возможности), речь пойдет только об общих заголовках объектов под 64-битными виртуальными машинами, jdk1.8.0_221, параметры jvm: -XX:-UseCompressedOops, надеюсь будет полезен читателям.

2. Знай ООП

  • Один из краеугольных камней oo-klass, давайте взглянем на oop (собственно oopDesc*)
typedef class oopDesc*                            oop;

class oopDesc{
    friend class VMStructs;
 private:
  volatile markOop  _mark;
  union _metadata {
    Klass*      _klass;
    narrowKlass _compressed_klass;
  } _metadata;
}

2.1, система наследования oop

  • Взято из JDK8, из исходного кода XXOOP является псевдонимом xxxoopdesc*.
typedef class oopDesc*                            oop;
typedef class   instanceOopDesc*            instanceOop;
typedef class   arrayOopDesc*                    arrayOop;
typedef class     objArrayOopDesc*            objArrayOop;
typedef class     typeArrayOopDesc*            typeArrayOop;
  • В основном instanceOopDesc ​​и arrayOopDesc. Оба унаследованы от oopDesc, и нет расширенного атрибута поля, который не будет описан ниже. То есть все атрибуты markword и klass instanceOopDesc ​​и arrayOopDesc ​​взяты из oopDesc, arrayOopDesc ​​немного особенный, о чем будет подробно рассказано ниже.

2.2, Описание Экземпляра

  • Обычные объекты Java — это instanceOopDesc, независимо от того, является ли он типом-оболочкой или примитивным типом.
  • 🌰 вот и мы.

  • Видно, что объекты обычных типов также располагаются с заголовком объекта.

2.3, массивOopDesc

  • objArrayOopDesc ​​и typeArrayOopDesc ​​наследуются от arrayOopDesc, где тип массива типа-обертки — objArrayOopDesc, а массив базового типа — typeArrayOopDesc.

  • Атрибуты oop упомянуты выше, среди которых arrayOopDesc ​​немного особенный, у него есть не только markword, klass, но и атрибут length для записи длины массива. Но глядя на исходный код jdk, помимо наследования от arrayOopDesc, arrayOopDesc ​​не расширяет никакие атрибуты.Откуда берется атрибут length? На самом деле атрибут длины является частью заголовка объекта, он не существует как независимый атрибут, а является значением, хранящимся в фиксированной позиции после маркворда и класса заголовка объекта.
  • Как видно из следующей простой иллюстрации, в 64-битной виртуальной машине длина появляется в позиции offset=16. Совсем не случайно, что 3 и 4 равны длине массива, и читатели могут убедиться в этом сами.

  • Примечание: Заголовок объекта не имеет ничего общего с данными экземпляра, фактически длина arrayOopDesc ​​принадлежит заголовку объекта, а не части данных.

2.4, ключевое слово

  • Markword является частью oop, среди которых hashcode, GC, облегченная блокировка/тяжеловесная блокировка/блокировка смещения и возраст поколения — все это вызывает суету вокруг markword. markword начинается со смещения=0 заголовка объекта и занимает 8 байт на 64-битной виртуальной машине.

  • Приведенную выше картинку видели много раз, и из названия видно, что то, что я сказал выше, правда. Итак, возникает вопрос. Многие люди могут с первого взгляда увидеть, что 8 полей в вашей статье имеют 64 бита, за исключением того, что один видит 1. Я могу понять, что у вас нет знака блокировки. Вы тоже съели хэш-код? Вы пишете любое количество объектов с хэш-кодами 0?
  • Сначала я тоже был удивлен, что мои кости поражены (было такое ощущение, что я могу добыть человеческий мозг и вычислить md5 вручную), шучу. . . Java так легко раздуть, стоит ли переходить на php? Сан Ниан, ты слишком мало читаешь. 🌰 вот и мы.

  • Посмотрите внимательно на картинку, я думаю, вы поймете. Обратите внимание, что markword=00000008807e2501, из которых неиспользуемые 25 бит, хэш-код равен integers1.hashcode(), и 2 бита флага также в порядке.

  • Посмотрите на смещенное состояние блокировки (бит флага 101)

3. Резюме

  • В основном представляет заголовок объекта java, включая заголовок объекта экземпляра и заголовок объекта массива.
  • Краткое описание метки в заголовке объекта в сочетании с демонстрацией, чтобы привлечь внимание других. Что касается изменений маркировки в процессе обновления замков с предвзятостью, замков облегченного типа и замков тяжелого веса, в последующем могут быть подробные страницы. Тем не менее, все они сделаны в заголовке объекта Java, и читатели могут проверить это самостоятельно в сочетании с блок-схемой эскалации блокировки.