RFR: 8256517: (ref) Reference.clear during reference processing may lose notification

Kim Barrett kbarrett at openjdk.java.net
Mon Nov 23 02:41:27 UTC 2020


Please review this change to Reference.clear() to address several issues.

(JDK-8240696) For GCs using a SATB barrier, simply assigning the referent
field to null may extend the lifetime of the referent value.

(JDK-8240696) For GCs with concurrent reference processing, clearing the
referent field during reference processing may discard the expected
notification.

Both of these are addressed by introducing a private native helper function
for clearing the referent, rather than using an ordinary in-Java field
assignment. Tests have been added for both of these issues. This required
adding a new breakpoint in reference processing for ZGC.

Of course, finalization adds some complexity to the problem.  We deal with
that by having FinalReference override clear.  The implementation is
provided by a new package-private method in Reference.  (There are a number
of alternatives, all of them clumsy; finalization is annoying that way.)

While dealing with FinalReference clearing it was noted that the recent
JDK-8256106 and JDK-8256370 have some problems. FinalizerHistogram was not
updated to call the new Reference.getInactive(), instead still calling get()
on FinalReferences, with the JDK-8256106 problems. Fixing that showed the
assertion for inactive FinalReference added by JDK-8256370 used the wrong
test.

Rather than tracking down and changing all get() and clear() calls on final
references and changing them to use getInactive and a new similar clear
function, I've changed FinalReference to override get and clear, which call
the helper functions in Reference. I've also renamed getInactive to be more
explanatory and less convenient to call directly, and similarly named the
helper for clear. This means that get/clear should never be called on an
active FinalReference. That's already never done, and would have problems
if it were.

Testing:
mach5 tier1-6
Local (linux-x64) tier1 using Shenandoah.
New TestReferenceClearDuringMarking fails for G1 without these changes.
New TestReferenceClearDuringReferenceProcessing fails for ZGC without these changes.

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

Commit messages:
 - add private native Reference::clear0
 - test clear during marking
 - test clear during reference processing

Changes: https://git.openjdk.java.net/jdk/pull/1376/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=1376&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8256517
  Stats: 304 lines in 13 files changed: 279 ins; 16 del; 9 mod
  Patch: https://git.openjdk.java.net/jdk/pull/1376.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/1376/head:pull/1376

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


More information about the core-libs-dev mailing list