RFR: 8139457: Array bases are aligned at HeapWord granularity [v50]

Albert Mingkun Yang ayang at openjdk.org
Tue Aug 15 14:47:29 UTC 2023


On Wed, 12 Jul 2023 14:14:46 GMT, Roman Kennke <rkennke at openjdk.org> wrote:

>> See [JDK-8139457](https://bugs.openjdk.org/browse/JDK-8139457) for details.
>> 
>> Basically, when running with -XX:-UseCompressedClassPointers, arrays will have a gap between the length field and the first array element, because array elements will only start at word-aligned offsets. This is not necessary for smaller-than-word elements.
>> 
>> Also, while it is not very important now, it will become very important with Lilliput, which eliminates the Klass field and would always put the length field at offset 8, and leave a gap between offset 12 and 16.
>> 
>> Testing:
>>  - [x] runtime/FieldLayout/ArrayBaseOffsets.java (x86_64, x86_32, aarch64, arm, riscv, s390)
>>  - [x] bootcycle (x86_64, x86_32, aarch64, arm, riscv, s390)
>>  - [x] tier1 (x86_64, x86_32, aarch64, riscv)
>>  - [x] tier2 (x86_64, aarch64, riscv)
>>  - [x] tier3 (x86_64, riscv)
>
> Roman Kennke has updated the pull request incrementally with one additional commit since the last revision:
> 
>   RISCV fixes by @RealYFang

src/hotspot/share/oops/arrayOop.hpp line 49:

> 47:   // Interpreter/Compiler offsets
> 48: 
> 49: public:

Could this method be moved next to `length_offset_in_bytes` as they are closely related? (Then, this `public` becomes unneeded.)

src/hotspot/share/oops/arrayOop.hpp line 94:

> 92:   // Returns the offset of the first element.
> 93:   static int base_offset_in_bytes(BasicType type) {
> 94:     size_t hs = header_size_in_bytes();

Previously, the memory representation of an array is `[header] + [payload]`. The "header" part includes the necessary alignment gap if any. (IOW, the end of the header and the beginning of the payload is adjacent.) The public API has `header_size(...)` and `base_offset_in_bytes(...)`, which corresponds to the header and payload, respectively.

With the new change, the header is *not* word-alignment any more. Could the API (and its impl) be adjusted to maintain the original model `array = [header] + [payload]`. Sth like, `header_size_in_bytes(...)` includes the alignment gap and replaces `header_size` in the public API.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/11044#discussion_r1286890020
PR Review Comment: https://git.openjdk.org/jdk/pull/11044#discussion_r1294691072


More information about the hotspot-dev mailing list