размер ссылочного типа в Java - PullRequest
5 голосов
/ 18 марта 2011

Почему ссылочный тип в Java занимает 8 байт? Почему не меньше или больше 8 байт?

Ответы [ 5 ]

9 голосов
/ 18 марта 2011

На самом деле, нигде не указано, сколько байтов должна иметь ссылочная переменная, и фактически она не везде одинакова.

Общие виртуальные машины для 32-разрядных систем (то есть систем с 32-разрядными адресами).в шине памяти) обычно используют 32-битный (= 4 байта, как int и float) в качестве размера для ссылок на объекты, в то время как виртуальные машины для 64-битных систем часто используют собственный размер адреса 64 бит (=8 байт) для этих.(Обратите внимание, что большинство 64-битных систем также могут запускать 32-битные программы, поэтому часто даже там вы будете использовать 32-битную ВМ.)

Это просто вопрос упрощения реализации, если вы можетеиспользуйте реальный адрес памяти для ваших ссылок вместо чего-то другого.

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

Другие виртуальные машины могут использовать аналогичные приемы.

4 голосов
/ 18 марта 2011

Это потому, что ссылочная переменная фактически не содержит объект.Это способ добраться до объекта.То, как JVM справляется с этим, является нашей наименьшей проблемой.Вы можете думать об этом как об адресе расположения объекта в куче.Но он не должен быть таким простым, как адрес.

2 голосов
/ 18 мая 2013

Позвольте мне привести пример, который поможет вам лучше понять

    String myName = new String("John");
    String yourName = new String("John");
    if (myName == yourName) 
    {
        System.out.println("Refereces point to Same objects on heap");
    } else 
    {
        System.out.println("Refereces point to different objects on heap");
    }

и вывод Ссылки указывают на разные объекты в куче .

Здесь myName и yourName - это две ссылки, которые указывают на объекты типа String ( память, выделенная в Heap ). Примечание: память для ссылочных переменных распределяется в stack , а не в Heap Обе ссылочные переменные просто имеют адрес (или аналогичную уникальную абстракцию) объекта String, который находится в куче. Размер адреса будет постоянным для конкретной архитектуры ОС. В случае 32 битов это будет 4 байта, тогда как для 64 битов это будет 8 байтов.

Таким образом, размер указанных объектов может быть изменен, но размер ссылок остается таким же, как они просто несут адрес, который остается постоянным для любой конкретной архитектуры.

0 голосов
/ 18 марта 2011

Значения ссылки на тип можно рассматривать как указатели на объекты. 8 байт должны указывать это в куче.

Читать о Структура виртуальной машины Java

0 голосов
/ 18 марта 2011

8 байт - это размер переменной Long в Java и позволяет ссылаться на ссылки 1.01457092 × 10 ^ 19, что должно быть достаточно для большинства приложений и больше, чем большинство жестких дисков, которые могут адресовать, учитывая, что каждая из этих контрольных точек нужно также хранить данные ...

Edit: Прочитав один из других ответов, я хотел уточнить, что ссылка является просто указателем на данные и не содержит данных, поэтому архитекторы Java решили использовать 64-битные значения для обозначения ссылок, потому что это дает вам огромное адресное пространство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...