Подтвердить что ты не робот

Почему объекты Java должны быть кратными 8?

Я знаю, что Java использует отступы; объекты должны быть кратными 8 байтам. Однако я не вижу цели. Для чего его используют? Какова его главная цель?

4b9b3361

Ответ 1

Его назначение alignment, что позволяет быстрее получать доступ к памяти за счет некоторого пространства. Если данные не выравниваются, то после загрузки памяти процессору необходимо сделать некоторые смены.

Кроме того, сбор мусора упрощается (и ускоряется), чем размер самого маленького блока выделения.

Маловероятно, что Java имеет требование 8 байтов (за исключением 64-битных систем), но поскольку 32-разрядные архитектуры были нормой при создании Java, возможно, что в стандарте Java требуется 4-байтовое выравнивание.

Ответ 2

Принятый ответ - это предположение (но частично правильное). Вот реальный ответ.

В первую очередь, к кредиту @U2EF1, одним из преимуществ 8-байтовых границ является то, что 8-байты являются оптимальным доступом для большинства процессоров. Однако было больше решений, чем это.

Если у вас есть 32-битные ссылки, вы можете адресовать до 2 ^ 32 или 4 ГБ памяти (практически у вас меньше, чем у 3,5 ГБ). Если у вас есть 64-битные ссылки, вы можете адресовать 2 ^ 64, которые являются террабайтами памяти. Однако, с 64-битными ссылками, все имеет тенденцию замедляться и занимать больше места. Это связано с накладными расходами на 32-разрядные процессоры, работающие с 64-битными, и на всех процессорах больше циклов GC из-за меньшего количества пространства и больше сбора мусора.

Итак, создатели заняли среднюю позицию и решили использовать 35-битные ссылки, которые позволяют хранить до 2 ^ 35 или 32 ГБ памяти и занимать меньше места, чтобы иметь одинаковые преимущества 32-битных ссылок. Это делается с помощью 32-битной ссылки и сдвига, при чтении она остается 3 бита, а при сохранении ссылок - 3 бита. Это означает, что все объекты должны быть выровнены на границах 2 ^ 3 (8 байтов). Они называются сжатыми обычными указателями объектов или сжатыми oops.

Почему не 36-битные ссылки для доступа к 64 ГБ памяти? Ну, это был компромисс. Вам потребуется много потраченного пространства для 16-байтовых выравниваний, и, насколько я знаю, подавляющее большинство процессоров не получают выигрыша по скорости от выравниваний по 16 байт, а не от 8-байтовых выравниваний.

Обратите внимание, что JVM не беспокоится об использовании сжатых oops, если максимальная память не превышает 4 ГБ, что по умолчанию не используется. Фактически вы можете включить их с помощью флага -XX:+UsedCompressedOops.

Это было в день 32-разрядных виртуальных машин, чтобы предоставить дополнительную доступную память в 64-битных системах. Насколько я знаю, ограничений нет в 64-битных виртуальных машинах.

Источник: производительность Java: окончательное руководство, глава 8

Ответ 3

Размеры типов данных в Java кратны 8 битам (не байтам), поскольку размеры слов в большинстве современных процессоров являются кратными 8-битными: 16-битными, 32-битными, 64-битными. Таким образом, поле в объекте может быть скомпоновано ( "выровнено" ) словом или словами и отброшено как можно меньше места, используя основные инструкции процессора для работы с данными размера слова.