[PATCH] Reduce Chance Of Mistakenly Early Backing Memory Cleanup

Paul Sandoz paul.sandoz at oracle.com
Mon Mar 12 16:28:00 UTC 2018


Hi Peter,

Thanks, well spotted. I adjusted to:

  try {
      return finalized.get();
  } finally {
    Reference.reachabilityFence(o);
  }

I also created this issue:
 
  https://bugs.openjdk.java.net/browse/JDK-8199462
  http://cr.openjdk.java.net/~psandoz/jdk/buffer-reachability-fence/webrev/

I will push today or tomorrow.

Paul.

> On Mar 11, 2018, at 1:03 AM, Peter Levart <peter.levart at gmail.com> wrote:
> 
> Hi,
> 
> On 03/02/18 18:15, Paul Sandoz wrote:
>> Thanks!
>> Paul.
>> 
>> 
>>> On Mar 2, 2018, at 9:11 AM, Vladimir Ivanov <vladimir.x.ivanov at oracle.com>
>>>  wrote:
>>> 
>>> 
>>> 
>>> On 3/2/18 8:01 PM, Paul Sandoz wrote:
>>> 
>>>> Here’s an update Ben and I tweaked:
>>>>   
>>>> http://cr.openjdk.java.net/~psandoz/jdk/buffer-reachability-fence/webrev/index.html
>>>> 
>>>> I think this looks good but would still like to double check with Vladimir that the @ForceInline is not problematic.
>>>> 
>>> I confirm that my previous analysis [1] still applies when method is marked w/ @ForceInline.
>>> 
>>> Best regards,
>>> Vladimir Ivanov
>>> 
>>> [1] 
>>> http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-February/051312.html
> 
> 
> I was going to suggest to add a test for that JIT assumption, but I see there's already a test called ReachabilityFenceTest that should catch a change in JIT behavior that would break reachabilityFence(). I spotted a flaw in that test. See method fenced():
> 
>     public static boolean fenced() {
>         AtomicBoolean finalized = new AtomicBoolean();
>         MyFinalizeable o = new MyFinalizeable(finalized);
> 
>         for (int i = 0; i < LOOP_ITERS; i++) {
>             if (finalized.get()) break;
>             if (i > WARMUP_LOOP_ITERS) {
>                 System.gc();
>                 System.runFinalization();
>             }
>         }
> 
>         Reference.reachabilityFence(o);
> 
>         return finalized.get();
>     }
> 
> 
> The last two statements should be reversed or else the test could produce a false alarm:
> 
> 
>         boolean fin = finalized.get(); 
>         Reference.reachabilityFence(o);
>         return fin;
> 
> 
> Regards, Peter
> 



More information about the core-libs-dev mailing list