2015-04-21 6 views
1

Как ссылается хранятся в памяти стека. Например предположим,Хранение ссылок в памяти стека

A a = new A(); 

Это a также должны храниться в памяти и должен имеет адрес памяти право?

Если я объясню больше, если мы напечатаем System.out.println(a), он напечатает адрес памяти «объект А». Но как я могу напечатать адрес памяти a?

Исправление: Если печать System.out.println(a) будет печататься хэш-код «объекта A», а не адрес памяти объекта А

ответ

1

Но как я могу распечатать адрес ссылки a?

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

Кроме того, следует отметить, что на переменную стека на самом деле не гарантируется наличие адреса памяти. Это не редкость для них полностью находиться в реестрах и никогда не сбрасываться в память.

Однако, следует также отметить, что, в отличие от того, что вы говорите, System.out.println(a) будет не напечатать адрес объекта ссылается a.То, что он печатает, также не определено спецификацией, но реализация Oracle выводит хэш-код идентификатора a, а не его адрес. Адрес a даже не гарантированно остается постоянным в течение всего срока его службы, так как GC может перемещать его.

+0

исправить свой хэш-код "a" – Harshana

0

Ваше предположение неисправна; System.out.println(a); напечатает адрес дескриптора объекта, а не сам objcet:

В некоторых реализациях Oracle для виртуальной машины Java, ссылки на экземпляр класса является указателем на ручку, который сам Пара указателей: одна для таблицы, содержащая методы объекта и указатель на объект класса, который представляет тип объекта , а другой - в память, выделенную из кучи для данных объекта.

(https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.7)

Как JVM «оставляет за собой право», чтобы переместить вещи о в памяти во время выполнения, ссылка на объект JVM сама не будет гарантирована, чтобы быть пригодным для чего-либо. Фактически, когда Java выполняет сборку мусора, она не гарантирует размещения указателей пересылки на новый адрес живых объектов, что делает вероятным, что сбор мусора будет отображать адрес JVM (даже если вы получили ) бесполезно.

См. http://www.cs.cornell.edu/courses/cs312/2003fa/lectures/sec24.htm для упрощенного объяснения того, как работает сбор мусора.

+0

Я не понял смысла «адреса ручки для объекта». Как вы упомянули даже «a» cosider как указатель, указатель, который он должен хранить в памяти, знает. Я понял, что указатель «a» имеет значение как хэш-код объекта A – Harshana

+0

Обновленный ответ. – EvenLisle

0

System.out.println(a) отпечатки a.hashCode() (за исключением случаев, когда a.toString() is overriden), который не обязательно должен быть адресом a.

Смежные вопросы