RFR: 8305895: Implementation: JEP 450: Compact Object Headers (Experimental)

Roman Kennke rkennke at openjdk.org
Fri May 12 19:08:11 UTC 2023


This is the main body of the JEP 450: Compact Object Headers (Experimental).

Main changes:
 - Introduction of the (experimental) flag UseCompactObjectHeaders. All changes in this PR are protected by this flag.
 - The compressed Klass* can now be stored in the mark-word of objects. In order to be able to do this, we are building on #10907, #13582 and #13779 to protect the relevant (upper 32) bits of the mark-word. Significant parts of this PR deal with loading the compressed Klass* from the mark-word, and dealing with (monitor-)locked objects. When the object is monitor-locked, we load the displaced mark-word from the monitor, and load the compressed Klass* from there. This PR also changes some code paths (mostly in GCs) to be more careful when accessing Klass* (or mark-word or size) to be able to fetch it from the forwardee in case the object is forwarded, and/or reach through to the monitor when the object is locked by a monitor.
 - The identity hash-code is narrowed to 25 bits.
 - Instances can now have their base-offset (the offset where the field layouter starts to place fields) at offset 8 (instead of 12 or 16).
 - Arrays will can now store their length at offset 8. Due to alignment restrictions, array elements will still start at offset 16. #11044 will resolve that restriction and allow array elements to start at offset 12 (except for long, double and uncompressed oops, which are still required to start at an element-aligned offset).
 - CDS can now write and read archives with the compressed header. However, it is not possible to read an archive that has been written with an opposite setting of UseCompactObjectHeaders.

Testing:
 (+UseCompactObjectHeaders tests are run with the flag hard-patched into the build, to also catch @flagless tests, and to avoid mismatches with CDS - see above.)
 - [x] tier1 (x86_64)
 - [x] tier2 (x86_64)
 - [x] tier3 (x86_64)
 - [ ] tier4 (x86_64)
 - [x] tier1 (aarch64)
 - [x] tier2 (aarch64)
 - [x] tier3 (aarch64)
 - [ ] tier4 (aarch64)
 - [ ] tier1 (x86_64) +UseCompactObjectHeaders
 - [ ] tier2 (x86_64) +UseCompactObjectHeaders
 - [ ] tier3 (x86_64) +UseCompactObjectHeaders
 - [ ] tier4 (x86_64) +UseCompactObjectHeaders
 - [ ] tier1 (aarch64) +UseCompactObjectHeaders
 - [ ] tier2 (aarch64) +UseCompactObjectHeaders
 - [ ] tier3 (aarch64) +UseCompactObjectHeaders
 - [ ] tier4 (aarch64) +UseCompactObjectHeaders

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

Depends on: https://git.openjdk.org/jdk/pull/13779

Commit messages:
 - Consolidate _LP64 #ifdef
 - Remove obsolete check
 - Handle klass offset in JVMCI
 - Disable CDS tests when running with +UseCompactObjectHeaders
 - Merge branch 'JDK-8305898' into JDK-8305895-v2
 - @colenp review comments
 - Remove obsolete code
 - Some hashcode improvements (mostly SA)
 - Merge remote-tracking branch 'origin/JDK-8305895' into JDK-8305895
 - Fix some uses of klass_offset_in_bytes()
 - ... and 36 more: https://git.openjdk.org/jdk/compare/880d564a...a6e9f10a

Changes: https://git.openjdk.org/jdk/pull/13961/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=13961&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8305895
  Stats: 1306 lines in 98 files changed: 1025 ins; 94 del; 187 mod
  Patch: https://git.openjdk.org/jdk/pull/13961.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/13961/head:pull/13961

PR: https://git.openjdk.org/jdk/pull/13961


More information about the hotspot-dev mailing list