Подтвердить что ты не робот

Если сборщик мусора Java перемещает объекты, что такое Object.hashCode и System.identityHashCode?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

ИдентификаторHashCode не изменяется для объекта. Таким образом, любое перемещение происходит под этим уровнем.

У элементарной реализации будет логический адрес → отображение физического адреса для каждого объекта.

Более сложные реализации будут иметь только отображение на уровне страницы, поэтому, возможно, последние 6 бит - это смещение памяти, а остальные - идентификатор страницы. Косвенное указание будет происходить на уровне страницы id → фактического адреса страницы.

Ответ 3

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

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