java garbage-collection hashcode internals object-identity

Si el recolector de basura de Java mueve objetos, ¿qué es Object.hashCode y System.identityHashCode?



garbage-collection internals (3)

A menudo he escuchado que estos métodos ( Object.hashCode y System.identityHashCode ) devuelven la dirección del objeto, o algo que se computa rápidamente desde la dirección; pero también estoy bastante seguro de que el recolector de basura se mueve y compacta los objetos. Dado que el código hash no puede cambiar, esto presenta un problema. Sé que esto no es algo que uno necesite saber para el trabajo diario, pero me gustaría entender las partes internas. Entonces, ¿alguien sabe cómo esto se implementa en Java? O .NET, ya que probablemente sean similares.


El identificadorHashCode no cambia para un objeto. Entonces cualquier movimiento se hace debajo de ese nivel.

Una implementación rudimentaria tendría una dirección lógica -> mapeo de direcciones físicas para cada objeto.

Las implementaciones más sofisticadas solo tendrían la asignación a nivel de página, por lo que quizás los últimos 6 bits sean la compensación de memoria, y el resto es la identificación de la página. La indirección ocurriría en la página id -> nivel de dirección de la página real.


En .net, el método getHash () se verá afectado por el GC y, por lo tanto, se recomienda que los desarrolladores usen sus propias implementaciones de hash. No puedo encontrar el enlace a la implementación interna en ese momento. Lo publicaré más tarde si lo encuentro ..

Encontré el enlace ... Esta pregunta fue respondida here


La implementación de .NET no se publica intencionalmente (y cuando intenta descompilarlo, encontrará que realiza una llamada de marco no administrado). La única documentación como tal está here , que solo indica que "no se garantiza que produzca un valor diferente para cada objeto", y "puede cambiar entre versiones de marco". Hacer suposiciones acerca de cómo funciona realmente es probablemente desacertado.

Java es más conocido (aunque presumiblemente podría diferir entre las JVM), y se trata específicamente en esta pregunta: Will .hashcode () devolverá un int diferente debido a la compactación del espacio de tenencia?

La esencia de la implementación de Java es que, por contrato, el valor del código hash de un objeto no es relevante hasta que se recupera por primera vez. Después de eso, debe permanecer constante. Por lo tanto, el GC que mueve el objeto no tiene importancia hasta que se llame al método hashcode () del objeto por primera vez. Después de eso, se usa un valor en caché.