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, и читатели могут проверить это самостоятельно в сочетании с блок-схемой эскалации блокировки.