RFR: 8357525: Default CDS archive becomes non-deterministic after JDK-8305895
Ioi Lam
iklam at openjdk.org
Thu May 22 06:08:27 UTC 2025
Since [JDK-8305895](https://bugs.openjdk.org/browse/JDK-8305895), interfaces and abstract classes are allocated outside of the class space. See [here for the triggering condition](https://github.com/openjdk/jdk/blame/4d7068923cd87fbfc2edee25406521b11580d153/src/hotspot/share/classfile/classFileParser.cpp#L5835-L5842)
Theoretically such InstanceKlasses can have arbitrary addresses, so the test of `(uintptr_t(existing) < uintptr_t(klass))` in [Klass::hash_insert()](https://github.com/openjdk/jdk/blob/4d7068923cd87fbfc2edee25406521b11580d153/src/hotspot/share/oops/klass.cpp#L458) no longer produces a deterministic result across two JVM runs. As a result, we have seen several occurrence of non-deterministic CDS archives in our test pipeline for a short period after [JDK-8305895](https://bugs.openjdk.org/browse/JDK-8305895) for pushed.
Thereafter, for some unknown reason, the problem disappears. However, we could just be lucky due to allocation policy changes in metaspace. The underlying cause still exists.
I wrote a proof of concept that shows the problem. See https://github.com/openjdk/jdk/commit/33185705f85986e1ee1e529005898e834cc8a88f
(Without fix)
$ java -Xshare:dump -XX:+UseNewCode -XX:SharedArchiveFile=f1.jsa
$ java -Xshare:dump -XX:+UseNewCode2 -XX:SharedArchiveFile=f2.jsa
$ cksum f1.jsa f2.jsa
2834014305 16105472 f1.jsa
4126337207 16105472 f2.jsa
(With the fix in this PR)
$ java -Xshare:dump -XX:+UseNewCode -XX:+UseNewCode3 -XX:SharedArchiveFile=f1.jsa
$ java -Xshare:dump -XX:+UseNewCode2 -XX:+UseNewCode3 -XX:SharedArchiveFile=f2.jsa
$ cksum f1.jsa f2.jsa
3637571299 16105472 f1.jsa
3637571299 16105472 f2.jsa
With the fix, we re-hash the copy of the `secondary_supers` in the CDS archive. When InstanceKlasses are copied into the CDS archive, they are sorted by their names. This makes the `(uintptr_t(existing) < uintptr_t(klass))` comparison produce deterministic results.
Unfortunately it's not possible to write a jtreg test for this problem.
-------------
Commit messages:
- 8343892: Default CDS archive becomes non-deterministic after JDK-8305895
Changes: https://git.openjdk.org/jdk/pull/25373/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=25373&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8357525
Stats: 12 lines in 1 file changed: 8 ins; 0 del; 4 mod
Patch: https://git.openjdk.org/jdk/pull/25373.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/25373/head:pull/25373
PR: https://git.openjdk.org/jdk/pull/25373
More information about the hotspot-dev
mailing list