На самом деле, нигде не указано, сколько байтов должна иметь ссылочная переменная, и фактически она не везде одинакова.
Общие виртуальные машины для 32-разрядных систем (то есть систем с 32-разрядными адресами).в шине памяти) обычно используют 32-битный (= 4 байта, как int
и float
) в качестве размера для ссылок на объекты, в то время как виртуальные машины для 64-битных систем часто используют собственный размер адреса 64 бит (=8 байт) для этих.(Обратите внимание, что большинство 64-битных систем также могут запускать 32-битные программы, поэтому часто даже там вы будете использовать 32-битную ВМ.)
Это просто вопрос упрощения реализации, если вы можетеиспользуйте реальный адрес памяти для ваших ссылок вместо чего-то другого.
Поскольку это увеличивает размер используемой памяти (и часто нам фактически не нужно обращаться к , что много памяти), из Java 7 на 64-битная виртуальная машина HotSpot сможет использовать 32-битные ссылки при определенных условиях, то есть, когда куча меньше 32 ГБ (8 · 2 32 байт),Чтобы преобразовать их в фактический адрес памяти, они умножаются на 8 (поскольку объекты будут выровнены по 8-байтовым границам), а затем добавляются к базовому адресу (если это не ноль).(Для куч меньше 4 ГБ нам не нужен шаг умножения.)
Другие виртуальные машины могут использовать аналогичные приемы.