Насколько велика ссылка на объект в Java и какую именно информацию она содержит? - PullRequest
45 голосов
/ 11 июня 2009

Как программист, я думаю, что они выглядят как «объект java.lang.Object по адресу 1a234552» или похожи на что-то вроде s в

.
Object s = "hello";

Это правильно? Поэтому все ли ссылки имеют фиксированный размер?

Ответы [ 4 ]

57 голосов
/ 11 июня 2009

Хотя на многих виртуальных машинах размер ссылки равен собственному размеру указателя (т. Е. 32 бита для 32-битной JVM и 64-битной для 64-битной JVM), это не гарантируется - и, в частности, HotSpot делает это сейчас или скоро будет поддерживать "Compressed Oops" , которые являются 32-битными ссылками в 64-битной JVM. (Это не означает, что каждая ссылка сжата - прочитайте связанную статью для получения дополнительной информации, и об этом также есть много постов в блоге.)

В ответ на другой комментарий обратите внимание, что сама ссылка, как правило, является просто способом обращения к самому объекту. Является ли это прямым указателем памяти или нет, его цель - получить данные для объекта. Это в основном все, что действительно имеет значение. Если есть некоторые «запасные» биты (например, это 64-битная ссылка, и вам не нужна вся эта ширина только для представления местоположения объекта), то виртуальная машина может использовать эти данные для другой информации, такой как ее тип, что может позволить некоторые оптимизации. (См. Комментарий Тома для более подробной информации.)

Сам объект содержит информацию о типе (вероятно, в форме ссылки на экземпляр Class или что-то подобное - я не знаю достаточно подробно), а также другие необходимые «вещи» в заголовке, прежде чем вы получите пользовательские данные для объекта.

9 голосов
/ 11 июня 2009

Это не часть спецификации JLS или JVM, но на практике это будет адрес: 32-битный на 32-битном ЦП, 64 на 64.

pqism: Хорошо, понял, потому что после компиляции мы больше не заботимся о объявленном типе?

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

3 голосов
/ 11 июня 2009

Размер ссылки на объект зависит от JVM и архитектуры машины. Обычно на 32-битной машине это 32 бита, а на 64-битной - 64 бита. Тем не менее, я думаю, что OpenJDK 7 JVM будет поддерживать «сжатые указатели», которые сэкономят место на 64-битных машинах.

Информация о типе объекта хранится в самом объекте; то есть, если вы следуете 32-битному или 64-битному указателю (или, более вероятно, дескриптору) на объект, вы найдете другой указатель на экземпляр Class, который описывает тип, а также поля данных объект.

2 голосов
/ 11 июня 2009

Большинство людей склонны рассматривать ссылку на объект как указатель на язык C-like-memory-указатель. Хотя это технически не правильно, большинство реализаций реализуют его как указатель. Например, в случае указателей на сжатые объекты JVM хранит только биты с 3 по 34 64-битного указателя на 64-битной платформе. Другие реализации также могут использовать другую схему: ссылка может быть указателем на массив указателей, содержащий все объекты.

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