RFR: 8071507: (ref) Clear phantom reference as soft and weak references do
kim.barrett at oracle.com
Thu Dec 3 22:52:44 UTC 2015
On Dec 3, 2015, at 8:01 AM, Peter Levart <peter.levart at gmail.com> wrote:
> Hi Kim,
> Kudos for finding an observable change in behavior. Although the specification could also be read in a way so that this would not be observable. Originally it states:
> "Unlike soft and weak references, phantom references are not automatically cleared by the garbage collector as they are enqueued. An object that is reachable via phantom references will remain so until all such references are cleared or themselves become unreachable."
> I read this as: "... An object that is reachable via phantom references will remain phantom reachable ..."
> If phantom-reachable objects have links among them, this doesn't make them strongly reachable.
> So I would argue that when both roots to O1 and O2 (in the test) are finally removed, O1 and O2 should be considered phantom-reachable, regardless of the link from O1 -> O2. When root to O2 is removed before the 2nd GC round, P2 should be notified as O2 transitions from reachable -> phantom reachable. This is no different from the situation when both roots to O1 and O2 are removed at the same time before a GC round: both P1 and P2 are notified.
I don't think that reading is correct.
Consider the case of R being a weak (not phantom) reference. In that
case, X can never be "phantom reachable", because the definition of
that state includes "some phantom reference refers to it". If, in the
scenario described, the reference from O to X did not prevent (the
weak) R from being cleared and notified, the special rule for phantom
references would have no visible impact. In which case we wouldn't
need to change the specification; we could just change the
implementation and claim there was no specified visible difference.
More information about the hotspot-gc-dev