RFR: 8269897: Shenandoah: Resolve UNKNOWN access strength, where possible

Roman Kennke rkennke at openjdk.java.net
Thu Jul 8 18:36:10 UTC 2021


We've observed test failures in jcstress, see:
https://bugs.openjdk.java.net/browse/JDK-8269897

We used to treat UNKNOWN reference accesses like weak accesses. UNKNOWN is used for Unsafe, reflection and JNI accesses, where it cannot be determined at compilation-time if we are accessing a regular field or a Reflection.referent field. The rationale for treating UNKNOWN as weak was that if the reference is a regular reference, then the value would be strongly reachable anyway, and only if it is a referent field would reachability matter. However, it turns out that this assumption is wrong: the test shows that a reference that is only weakly reachable can be legitimately written into a field, thus resurrecting the reference, and when that weakly reachable reference is loaded, it would be (wrongly) filtered as NULL.

A fix is to treat UNKNOWN accesses as strong. Accessing Reference.referent via reflection, JNI or Unsafe is Bad Idea anyway.
This test shows the problem with CAS, but I believe it affects all accesses via reflection, JNI, etc.

Testing:
 - [x] the provided jcstress test
 - [x] hotspot_gc_shenandoah
 - [x] tier1

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

Commit messages:
 - Determine access strength in all runtime barriers, where possible
 - Treat UNKNOWN as STRONG more selectively only on CAE
 - 8269897: Shenandoah: Treat UNKNOWN refs access as strong

Changes: https://git.openjdk.java.net/jdk/pull/4697/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4697&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8269897
  Stats: 111 lines in 4 files changed: 43 ins; 35 del; 33 mod
  Patch: https://git.openjdk.java.net/jdk/pull/4697.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/4697/head:pull/4697

PR: https://git.openjdk.java.net/jdk/pull/4697



More information about the hotspot-gc-dev mailing list