Если сборщик мусора в Java перемещает объекты, что такое Object.hashCode и System.identityHashCode? - PullRequest
33 голосов
/ 26 августа 2011

Я часто слышал, что эти методы (Object.hashCode и System.identityHashCode) возвращают адрес объекта, или что-то быстро вычисляется по адресу;но я также уверен, что сборщик мусора перемещает и уплотняет объекты.Поскольку хэш-код не может быть изменен, это создает проблему.Я знаю, что это не то, что нужно знать для повседневной работы, но я хотел бы понять внутреннее.Итак, кто-нибудь знает, как это реализовано в Java?Или .NET, так как они, вероятно, похожи.

Ответы [ 3 ]

23 голосов
/ 26 августа 2011

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

Java более понятен (хотя предположительно может отличаться в разных JVM) и конкретно рассматривается в этом вопросе: Will .hashcode () возвращать другое значение int из-за сжатия пространства владения?

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

3 голосов
/ 26 августа 2011

identityHashCode не изменяется для объекта.Таким образом, любое движение делается ниже этого уровня.

Элементарная реализация будет иметь логический адрес -> отображение физического адреса для каждого объекта.

Более сложные реализации будут иметь отображение только на уровне страницы, поэтому, возможно, последние 6 битовсмещение памяти, а остальное - идентификатор страницы.Перенаправление произойдет при идентификаторе страницы -> фактический уровень адреса страницы.

1 голос
/ 26 августа 2011

В .net метод getHash () будет подвержен влиянию GC, и поэтому рекомендуется, чтобы разработчики использовали свои собственные реализации хеша.Я не могу найти ссылку на внутреннюю реализацию в их момент.Я опубликую это позже, если найду это ..

Нашел ссылку ... На этот вопрос был дан ответ здесь

...