2013-11-27 2 views
8

Является ли адрес объекта постоянным в течение его жизненного цикла или он может измениться? Я просто думал, что адрес объекта никогда не меняется. Является ли это JVM зависимым? Я не нашел никакой четкой спецификации.Является ли адрес объекта фиксированным в течение его жизненного цикла?

+0

Его JVM внутренний, потому что JVM магазин адрес ссылки в локальных переменных, JVM сборщик мусора играет роль после создания объекта и эталонного, что объект используется, Невидимый или Недоступен –

ответ

5

Адрес объекта в java не фиксирован; скорее, он может измениться (подвергаться условиям).

Это потому, что обычно объекты распределены в пространстве с эденом. Затем они переходят в пространство для оставшихся в живых, а затем также в пространство старого поколения, если они выжили в некоторых циклах сбора мусора. Так оно и есть. Но если объект выделяется в пространстве eden, а также мусор, собранный, оставаясь в том же пространстве, тогда адрес не изменится. Аналогично, если объект слишком велик, чтобы выделяться в пространстве eden, тогда JVM выделяет объект в старом поколении, и если он собирает мусор, оставаясь там, где он был выделен, то и адрес не изменяется.

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

Из приведенных выше условий ясно, что перемещение адреса зависит от JVM.

Надеюсь, это поможет.

EDIT

Отвечая на вопрос ниже:

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

hashCodes сохранены в заголовке объекта JVM. Так что это постоянно. При создании object он присваивается 1 по умолчанию, но когда вы впервые используете объект, он вычисляется и хранится в заголовке. Он никогда не меняется на протяжении всей жизни Object.

+2

Ответ кажется правильным.У меня есть одно сомнение, если я создаю новый объект и сохраняю его на карте, где он хранится на основе hashCode (который создается с использованием расположения памяти объекта в соответствии с java). Теперь адрес объекта изменился (в результате получился другой hashCode), так как в ответ, код никогда не сможет извлечь объект с карты? – dharam

+0

@dharam см. Мое редактирование. – Trying

1

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

Есть несколько GC (обычный знак & Sweep, например), которые этого не делают; вы можете использовать специализированную JVM, которая поддерживает их (например, пользовательскую сборку Jikes RVM), если вам нужна эта функция.

Обратите внимание, что каждый объект может содержать (в основном) уникальный идентификатор (по крайней мере, в JVM, который я видел), частично для поддержки базовой реализации hashcode.

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