Finalizer calls Reference.get() from the Finalizer to acquire the finalizee. 
Concurrent reference processing GCs like Shenandoah and ZGC would return NULL 
for unreachable referents, and thus would not call finalize() on them.

ZGC works around this by fixing the referent before enqueuing, so that the 
barrier would take the fast-path, but Shenandoah cannot do this.

It is ok to bypass the barrier altogether in this place, because the 
FinalReference is inactive and marking and reference-discovery treat inactive 
FinalReferences like strong references.

Testing:
 - [x] hotspot_gc_shenandoah
 - [x] tier1 +UseShenandoahGC +ShenandoahVerify
 - [x] tier2 +UseShenandoahGC +ShenandoahVerify
 - [ ] tier1
 - [ ] tier2

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

Commit messages:
 - 8256106: Bypass intrinsic/barrier when calling Reference.get() from Finalizer

Changes: https://git.openjdk.java.net/jdk/pull/1140/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=1140&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8256106
  Stats: 8 lines in 2 files changed: 7 ins; 0 del; 1 mod
  Patch: https://git.openjdk.java.net/jdk/pull/1140.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/1140/head:pull/1140

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

Reply via email to