предисловие
Неделя N работы из дома.
Не знаю, существует ли компания...
Ближе к дому, вернуться к основному тексту "заголовок объекта"
Для изучения Java заголовок объекта может быть одним из пунктов знаний для начала работы.
Если предположить, что есть дверь, ведущая в язык Java, то в заголовке объекта есть такая позиция, как «инструкция по входу в дверь», технических моментов нет, но знать надо.
"synchronizedГде хранится флаг блокировки? ","Сколько лет предмету?Каков возраст генерации объектов?» и т. д. Эти вопросы неизбежны при первом изучении Java, которые тесно связаны с заголовком объекта.
Если вам непонятен «заголовок объекта», вы можете продолжить его чтение.Эта статья покажет вам примерно то, что установлено в 🧠 вашего «объекта».
текст
Введение
Сначала выбрасываются базовые понятия, а уже потом у автора конкретные практики.
对象头(Object header)
Это дословный перевод, немного резковатый, по словам автора, он называется ""визитная карточка объекта«Также цепляет, в основном включает в себя основную информацию об объекте, такую как:
- макет
- статус GC
- тип
- состояние синхронизации
- (identity) hash code
- длина массива (Предпосылка заключается в том, что вы должны быть массивом)
идентификационный хэш-код означаетбез перезаписиПередайте хэш-код, рассчитанный jvm.
Весь заголовок объекта состоит из двух частей, а именно:klass pointerиMark Word.
Конечно, прежде чем представить эти две вещи, здесь необходимо подчеркнуть: эта статья основана на стандартномjdk1.8 и 64-битная средаОписан как стандарт.
klass pointer
Указатель класса обычно занимает 32 бита или 4 байта.Если у вас достаточно причин отключитьсжатие указателя, то есть добавляются параметры запуска-XX:-UseCompressedOops
Тогда он занимает 64 бита.
Однако здесь есть еще одна деталь: согласно расчету, после того, как размер кучи превысит 32 ГБ, сообщение об ошибке не будет выдаваться, даже если сжатие указателя не будет отключено, но сжатие указателя не произойдет.
Но этот автор не проводил настоящих испытаний, причина в том, что...
Размер кучи должен быть 32гб+ памяти, а часть памяти должна быть зарезервирована для не кучи и ОС.Машину с такой памятью не получить мелкими фабриками автора третьего эшелона.Однако автор нашел чужие тестовые статьи и поместите их внизу этой статьи.Друзья могут глянуть.
Содержимое хранилища указателя klass является указателем на информацию метаданных его класса, которая используется JVM для определения экземпляра класса, которым является этот объект.
В чем смысл? Если у вас есть ссылка на экземпляр Person, вам нужно найти метаданные, как показано на рисунке:
Mark Word
О знаке слова является относительно важным пунктом знаний для java-программистов, начните с картинки:
Под «сценой» в таблице также можно понимать «состояние», объект находится в состоянии в определенный момент времени, но между состояниямиможет переключиться.
То есть используемый вами объект находится в текущей таблице, в состоянии «одна строка».
Марк Ворд находится под 64-битной виртуальной машиной, то есть занимает 64-битный размер, то есть 8 байт пространства.
В состав входят:
- неиспользованный: неиспользованный
- хэш-код: упомянутый вышеidentityхэш-код, хэш-код в этой статье относится к идентификационному хэш-коду
- thread: идентификатор потока предвзятой записи блокировки
- эпоха: метка времени для проверки правильности блокировки смещения
- возраст: возраст поколения
- biad_lock флаг предвзятой блокировки
- знак замка замок
- pointer_to_lock_record облегченная блокировка указатель записи блокировки
- pointer_to_heavyweight_monitor указатель монитора блокировки веса
Если вы посмотрите на шрифт cms_free немного странно, то правильно, он начал прорисовываться какunused
, а позже отреагировал на включение по умолчанию"сжатие указателя", то этот бит должен бытьcms_free
.
cms_free
Из названия видно, что он имеет отношение к сборщику cms, потому что алгоритм cmsчистыйявляется сборщиком, поэтому проблема фрагментации памяти заключается в сохранении недоступных объектов в спискеfree list, автор предполагает, что это должно быть независимо от того, находится ли отмеченный объект вfree listсередина.
оcms_free
Вывод - это домыслы автора, можете не верить, если считаете высказывание автора неверным, можете мне сказать.
Если вы считаете то, что сказал автор, неправильным, но не можете предъявить доказательства, не нужно быть очень серьезным, ведь jdk14 cms был удален.
Новички много думают об этих вещах, и они могут начать с контента под строкой состояния без блокировки.
Если вы читаете эти вещи, вспомните, что автор сказал выше: «маркированное слово - относительно важная точка знаний для программистов Java», я думаю, вы также знаете причину.Эта часть имеет много общего с программой, например:
Почему возрастная установка продвигается на старое поколение (XX:MaxTenuringThreshold
) не может превышать15?
потому что это придает возрастчетыре битакосмос, самый большой1111(двоичный), то есть15, хранить негде.
почему твойsynchronizedЗаблокированные объекты, никакой «легендарной» предвзятой оптимизации блокировки?
Поскольку хэш-код не вычисляется после создания экземпляра объекта, он вычисляется путем вызова и помещается в слово метки.
Вы вызвали метод хэш-кода (или неявно: сохраненный в хэш-наборе ключ карты, вызванный по умолчанию непереопределенным методом toString() и т. д.), заняли «яму» и сместили поток, который хотите сохранить. нет места для сохранения идентификатора, поэтому, естественно, это напрямуюЛегкий замок.
(Или вы просто забыли добавить-XX:BiasedLockingStartupDelay=0
)
Кажется, что дизайн немного неразумный, но это также разумно, дизайн нижнего слоя настолько прост и скучен.
В этой статье основное внимание уделяется представлению «заголовка объекта», поэтому она не будет фокусироваться на блокировке. Как я только что сказал, «после вызова хэш-кода и повторной синхронизации обнаруживается, что это облегченная блокировка». На самом деле, есть много ситуаций.
Например: вsynchronizedВызванный в блоке метод расчета хэш-кода, даже если есть смещенная блокировка, будет отозван и расширен до тяжеловесной блокировки. Если вам повезет, в будущем вы сможете увидеть отдельную статью автора с описанием замков.
упражняться
Практика приносит истинное знание, если работник хочет хорошо работать, он должен сначала заточить свои инструменты и пользоваться инструментами.jolИнструмента достаточно, инструмента, предоставляемого openjdk, для анализа размера, макета и другой информации об объекте.
В этой статье используется самый простой способ представить проект в maven для тестирования.Вы также можете выбрать метод командной строки, оба из которых описаны в ссылке jol выше.
После введения jol мы начали печатать макет объекта, чтобы попробовать.
макет объекта массива
public static void main(String[] args) {
// 声明一枚长度为3306的数组
int[] intArr = new int[3306];
// 使用jol的ClassLayout工具分析对象布局
System.out.println(ClassLayout.parseInstance(intArr).toPrintable());
}
print:
------------------------------------------------------
[I object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363)
12 4 (object header) ea 0c 00 00 (11101010 00001100 00000000 00000000) (3306)
16 13224 int [I.<elements> N/A
Instance size: 13240 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
Если вы впервые смотрите на схему компоновки, напечатанную jol, вы можете непосредственно посмотреть на следующую схему, отмеченную автором:
Три части заголовка объекта, соответственно, подтверждают упомянутый выше указатель klass и Mark Word, а также уникальный атрибут длины массива.
Правая сторона использует три базы, чтобы показать значение «каждой строки», повторяя приведенное выше:
Исходный метод хэш-кода (включая метод System.identityHashCode) не вызывался, Тогда позиция хэш-кода равна 0.
Из графика можно сделать вывод, что когда объект только создается, он очень "чистый", на первый взгляд два ряда0, но только один1Это казалось очень резким.
На самом деле это001, для вышеупомянутогоФлаг блокировки смещения + флаг блокировки, состояние всех замков следующее:
Знак блокировки смещения | замок знак | государство |
---|---|---|
0 | 01 | нет замка |
1 | 01 | Блокировка смещения |
- | 00 | Легкий замок |
- | 10 | тяжелый замок |
- | 11 | маркеры ГХ |
На этот раз ясно, хотя есть1, но на самом деле это состояние без блокировки.
Вернемся к диаграмме компоновки, поскольку это объект-массив, он сохраняется в четвертой строке.длина массива, объекты, не являющиеся массивами, естественно, нет.
Расчет размера объекта также очень точен, а именно:13224(Int равно четырем байтам, умноженным на 3306) + 16 = 13240 байт.
Советы для вашей собственной практики
Увидев, что дизайн макета объекта такой незатейливый, вы тоже можете его опробовать.
Автор также прикрепляет несколько небольших напоминаний:
- Как упоминалось выше, влияние хэш-кода на блокировки смещения и блокировки веса
- упомянутый выше
-XX:BiasedLockingStartupDelay
Влияние параметров на предвзятое тестирование блокировки - Обратите внимание на тестовую машинубольшой и маленькийВлияние на порядок результатов, как правило, у всех машин обратный порядок байтов, поэтому значениезаказ печатиЭто обратный порядок полей, описанных на картинке в начале Markword выше.
Если вы не обратите внимание на эти моменты, вы можете растеряться после печати, не зная, какие биты соответствуют каким полям или даже отличаются от ожидаемых результатов.
Наконец
На самом деле есть много подробностей о структуре объектов, которые стоит прочитать.Эта статья лишь кратко знакомит с небольшой частью «Заголовка объекта».
Прочитав эту статью, вы хотите сказать что-то вроде автора:
Дизайн первого этажа такой неприхотливый и скучный.
Шучу, на самом деле посмотрите, и вам будет очень весело 😊.
Расширенная рекомендация
-
heapdump-is-a-lieСтатья, в которой ставится под сомнение размер объектов, отображаемых инструментом heapdump, и упоминается точность инструмента jol.
-
markOop.hppЧасть исходного кода jdk8 о markword
-
markWord.hppjdk14 Что касается исходного кода markword, посмотрите, какие изменения произошли после перехода на cms
-
ObjectHeader.txtРасположение заголовков объектов в трех случаях (64-битный, 64-битный сжатый указатель, 32-битный)
-
HotSpotGlossary.htmlГлоссарий хотспотов, эта статья охватывает только несколько слов в заголовке объекта.
-
Why 35GB Heap is Less Than 32GBДруг с машиной с памятью 35G протестировал виртуальную машину с выделенной памятью кучи 32G и обнаружил, что содержимое, которое можно сохранить, меньше, то есть проблема сжатия указателя, упомянутая в этой статье.