Как ссылки хранятся в Java - PullRequest
0 голосов
/ 07 мая 2020

Я начал глубже погружаться в JVM, управление памятью и способы хранения объектов. Пока я знаю, что при создании нового объекта Object a = new Object() a сохраняется в памяти стека и содержит ссылку (местоположение в памяти кучи) на сам объект.

Это все хорошо. Но мне интересно, где хранится адрес на ссылку. Как получить доступ к этой ссылке? Я предполагаю, что "a" содержит адрес первого байта, в котором находится ссылка, и, поскольку это ссылка на объект, допустим, что она будет длиной 8 байтов.

Вот визуальное изображение того, что я себе представляю. происходит

enter image description here

Я был бы признателен, если бы кто-нибудь мог дать мне более подробное или правильное объяснение, если я ошибаюсь, или указать мне на статью о это.

Теперь, когда я пытаюсь объяснить это, возникает еще один вопрос: как узнать размер объекта? Это где-то хранится в заголовках объектов?

1 Ответ

1 голос
/ 07 мая 2020

Объекты, за исключением особых обстоятельств, таких как escape-анализ , размещаются в куче.

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

Ссылка указывает на какое-то место в куче и автоматически разыменовывается средой выполнения Java. Из чистого Java у вас нет доступа к необработанным указателям или простому способу проверки размера объекта.

Фактические данные / структура, которые хранятся в куче, начинаются с того, что обычно называется заголовок объекта . Заголовок содержит (сжатый) указатель класса, ведущий к внутренней структуре данных, определяющей макет класса (хранится в отдельной области памяти под названием Metaspace - или в пространстве сжатых классов, если используются сжатые ООП).

Указатель может быть 4 или 8 байтов, в зависимости от архитектуры - даже в 64-битных системах это обычно 4 байта из-за комбинированных ООП оптимизации.

Вы можете использовать jol tool для печати макета объекта.

Наконец, этот пост от Алексея Шипилева содержит гораздо больше деталей о Java макете объекта: https://shipilev.net/jvm/objects-inside-out/

...