Размер ссылки класса в JAVA - PullRequest
2 голосов
/ 12 ноября 2009

Каков размер ссылки на класс в Java? Является ли оно постоянным для конкретной JVM и ОС независимо от класса, для которого сделана ссылка.


Class A
Class B
Class C

A a;
B b;
C c;

Являются ли размеры a, b и c одинаковыми, независимо от размера классов A, B и C?

Ответы [ 4 ]

3 голосов
/ 12 ноября 2009

Я не верю, что это явно указано; Скорее всего, решение остается за реализацией JVM (как и System.identityHashcode()). соответствующий раздел JLS определенно не упоминает какой-либо конкретный размер.

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

Мне любопытно, о чем вы спрашиваете об этом - это просто любопытство или вы планируете каким-то образом использовать эталонный размер (что почти наверняка будет плохой идеей)? Если это последнее, то дайте нам знать, что вы планируете делать, так как, вероятно, будет лучший способ добиться этого.

3 голосов
/ 12 ноября 2009

Да, все ссылки являются «указателями» на объекты или косвенными «указателями на указатели» на объекты. Их фактический размер памяти - это деталь реализации JVM, но вы можете быть уверены, что они имеют одинаковый размер для разных классов.

2 голосов
/ 12 ноября 2009

Ссылка - это, в основном, адрес памяти (да, я знаю, что это немного больше, чем в Java), и его размер не связан с размером объекта, на который он указывает. Единственное отличие состоит в том, что если вы используете 64-битную JVM, ссылки должны быть больше, чтобы соответствовать большим адресам памяти.

1 голос
/ 12 ноября 2009

Что касается байт-кода, ссылка ведет себя почти так же, как int или float. long и double занимают два слота стека. Так что, как если бы ссылки были четыре байта. Тем не менее, 64-разрядные системы часто используют эту возможность, чтобы использовать 64-разрядные указатели.

Некоторые JVM (я считаю, что BEA JRockit в течение некоторого времени и недавно добавлен в Sun) используют «сжатые операции», которые являются 32-разрядными, которые сдвигаются влево на несколько мест, чтобы обеспечить доступ к десяткам ГБ памяти в 64-разрядных системах. Наряду с уменьшением потребления памяти, уменьшение эталонного размера также снижает пропускную способность памяти процессора и требования к кэш-памяти, улучшая производительность, несмотря на дополнительные трудности.

Я полагаю, что версия Hotspot от Azul использует 64-битные ссылки, 48-битные для адреса и 16-битную информацию о типе.

...