32 bits header and alignment slack
Kennke, Roman
rkennke at amazon.de
Mon Mar 4 11:59:48 UTC 2024
Hello Remi,
> Hello,
> I was try to read the code corresponding to the compact identity hashcode
> https://wiki.openjdk.org/display/lilliput/Compact+Identity+Hashcode
>
> But I did not see any mention of the fact that due to object alignment, there is maybe already an empty 32 bits space at the end of the object.
> By example, with a java.lang.Integer and a 64 bits header, due to alignment to 64 bits, there is 32 bits of space which is not used after the value of the Integer
>
> j.l.Integer layout
> mark word / 64 bits
> value / 32 bits
> empty / 32 bits
>
> In that case, when System.identityHashCode() is called, it could use that space directly instead of waiting the GC to move the object to another location of the mostly same size.
>
> Obviously, there is a good chance that this is exactly what the VM currently does and I've just missed that part :)
I have not called it out separately, but it’s mentioned in side-sentences, like:
"The first call to System.identityHashCode() transitions the hash-bits from the 00 state to the 01 state, *if there is no sufficient alignment gap at the end of the object,* and return the computed i-hash.”
The current prototype does it that way.
https://github.com/openjdk/lilliput/pull/137
I’ll write it down more specifically.
Thanks for pointing out!
Roman
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
More information about the lilliput-dev
mailing list