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

It is also a follow-up to #20640, which now also includes (and supersedes) 
#20603 and #20605, plus the Tiny Class-Pointers parts that have been previously 
missing.

Main changes:
 - Introduction of the (experimental) flag UseCompactObjectHeaders. All changes 
in this PR are protected by this flag. The purpose of the flag is to provide a 
fallback, in case that users unexpectedly observe problems with the new 
implementation. The intention is that this flag will remain experimental and 
opt-in for at least one release, then make it on-by-default and diagnostic (?), 
and eventually deprecate and obsolete it. However, there are a few unknowns in 
that plan, specifically, we may want to further improve compact headers to 4 
bytes, we are planning to enhance the Klass* encoding to support virtually 
unlimited number of Klasses, at which point we could also obsolete 
UseCompressedClassPointers.
 - The compressed Klass* can now be stored in the mark-word of objects. In 
order to be able to do this, we are add some changes to GC forwarding (see 
below) to protect the relevant (upper 22) bits of the mark-word. Significant 
parts of this PR deal with loading the compressed Klass* from the mark-word. 
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.
 - Self-forwarding in GCs (which is used to deal with promotion failure) now 
uses a bit to indicate 'self-forwarding'. This is needed to preserve the 
crucial Klass* bits in the header. This also allows to get rid of 
preserved-header machinery in SerialGC and G1 (Parallel GC abuses 
preserved-marks to also find all other relevant oops).
 - Full GC forwarding now uses an encoding similar to compressed-oops. We have 
40 bits for that, and can encode up to 8TB of heap. When exceeding 8TB, we turn 
off UseCompressedClassPointers (except in ZGC, which doesn't use the GC 
forwarding at all).
 - 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 now store their length at offset 8.
 - 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. Some build machinery is added so that _coh 
variants of CDS archives are generated, next to the _nocoops variant.
 - Note that oopDesc::klass_offset_in_bytes() is not used by +UCOH paths 
anymore. The only exception is C2, which uses it as a placeholder/identifier of 
the special memory slice that only LoadNKlass uses. The backend then extracts 
the original oop and loads its mark-word and extracts the narrow-Klass* from 
that. I played with other approaches to implement LoadNKlass. Expanding it as a 
macro did not easily work, because C2 is missing a way to cast a word-sized 
integral to a narrow-Klass* (or at least I could not find it), and also I fear 
that doing so could mess with optimizations. This may be useful to revisit. 
OTOH, the approach that I have taken works and is similar to DecodeNKlass and 
similar instructions.

Testing:
 (+UseCompactObjectHeaders tests are run with the flag hard-patched into the 
build, to also catch @flagless tests.)
The below testing has been run many times, but not with this exact base version 
of the JDK. I want to hold off the full testing until we also have the Tiny 
Class-Pointers PR lined-up, and test with that.

 - [x] tier1 (x86_64)
 - [ ] tier2 (x86_64)
 - [ ] tier3 (x86_64)
 - [ ] tier4 (x86_64)
 - [x] tier1 (aarch64)
 - [ ] tier2 (aarch64)
 - [ ] tier3 (aarch64)
 - [ ] tier4 (aarch64)
 - [x] tier1 (x86_64) +UseCompactObjectHeaders
 - [ ] tier2 (x86_64) +UseCompactObjectHeaders
 - [ ] tier3 (x86_64) +UseCompactObjectHeaders
 - [ ] tier4 (x86_64) +UseCompactObjectHeaders
 - [x] tier1 (aarch64) +UseCompactObjectHeaders
 - [ ] tier2 (aarch64) +UseCompactObjectHeaders
 - [ ] tier3 (aarch64) +UseCompactObjectHeaders
 - [ ] tier4 (aarch64) +UseCompactObjectHeaders
 - [x] Running as a backport in production since >1 year.

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

Commit messages:
 - 8305895: Implement JEP 450: Compact Object Headers (Experimental)

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

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

Reply via email to