RFR: 8205163: ZGC: Keeps finalizable marked PhantomReference referents strongly alive

Per Liden per.liden at oracle.com
Mon Jun 18 10:42:13 UTC 2018


Looks good!

/Per

On 06/18/2018 11:54 AM, Stefan Karlsson wrote:
> Hi all,
> 
> Please review this patch to fix a bug where PhantomReferences can cause 
> otherwise finalizable objects to become considered as strongly reachable.
> 
> http://cr.openjdk.java.net/~stefank/8205163/webrev.01/
> https://bugs.openjdk.java.net/browse/JDK-8205163
> 
> ZGC has a concept of finalizable marked objects, for objects that are 
> only reachable through the referents of Finalizers.
> 
> When objects that have been finalizable marked, are later found to also 
> be strongly reachable, the marking strength is updated to strongly marked.
> 
> When "processing" SoftReferences, WeakReferences, and Finalizers, the GC 
> checks if the referents are strongly marked, and if not, later pushes 
> the References out to the pending list.
> 
> For PhantomReferences, the GC also checks if the referents are 
> finalizable marked, and if not, later pushes the PhantomReferences out 
> to the pending list.
> 
> Before the References are processed, the GC "discovers" References that 
> it "encounters" during the marking phase. The GC keeps track of 
> discovered References until the processing phase. If a Reference with a 
> live referent is encountered, it is not discovered, and instead the 
> fields (referent, discovered) are treated as normal fields.
> 
> The bug happens when the GC tries to discover a PhantomReference with a 
> finalizable marked referent. Since the referent is already live 
> according to the PhantomReferences's definition of live (finalizable or 
> strongly marked), the PhantomReference is not discovered, and the fields 
> are treated as normal fields. This means that the ordinary strong 
> marking closure is applied to both the referent and the discovered 
> field, causing the marking strength of the referent to be promoted from 
> finalizable marked to strongly marked. This increase in strength isn't 
> problematic for the PhantomReference, since it already considered the 
> referent to be alive. However, any Finalizers that depended on the 
> referent to only be finalizable marked, will now be dropped instead of 
> pushed to the pending list, and therefore the referent will not be 
> finalized.
> 
> The proposed patch prevents this problem by always discovering 
> PhantomReferences with finalizable marked referents. By doing this, the 
> marking code will not mark the referent as strongly reachable, the
> processing code will still drop the PhantomReference. And the 
> finalizable objects that were incorrectly kept alive, can now be finalized.
> 
> This was found in a closed test in higher-tier testing.
> 
> Thanks,
> StefanK



More information about the hotspot-gc-dev mailing list