RFR: 8067247: Crash: assert(method_holder->data() == 0 ...) failed: a) MT-unsafe modification of inline cache

Jamsheed C m jamsheed.c.m at oracle.com
Mon Mar 28 09:35:31 UTC 2016


Thank you Vladimir Ivanov.

Updated the test case, revised webrev: 
http://cr.openjdk.java.net/~jcm/8067247/webrev.hs.01

Best Regards,
Jamsheed

On 3/26/2016 12:12 AM, Vladimir Ivanov wrote:
> Nice work, Jamsheed!
>
>>     jdk part: http://cr.openjdk.java.net/~jcm/8067247/webrev.jdk.00/
>
> Looks good.
>
>>
>> newly added test case
>>   hotspot part:
>>      http://cr.openjdk.java.net/~jcm/8067247/webrev.hs.00/
>
> The test looks over-complicated.
>
> It seems what you need to do to trigger the crash is:
>
>   * specify -Xcomp -XX:CompileCommand=compileonly,MHInvokeTest::test 
> -XX:SoftRefLRUPolicyMSPerMB=0
>
>   * invoke MHInvokeTest::test once to (1) compile the method, (2) bind 
> the linker to the call site and (3) resolve the linker method;
>
> Method handle can point to an empty static method (no need to allocate 
> anything).
>
>   * clear the inline cache
>
>   * trigger GC (System.gc() / WB.fullGC())
>
> With -XX:SoftRefLRUPolicyMSPerMB=0 soft refs are treated as weak refs. 
> So, the LambdaForm should go away.
>
>   * invoke MH::test to trigger linker resolution again.
>
>
> Or, as a different approach, write a white box test in java.lang.invoke:
>
>   * specify -XX:SoftRefLRUPolicyMSPerMB=0
>
>   * trigger MH.invokeExact() / MH.invoke() linkage
>
>   * check MethodTypeForm.cachedLambdaForm(LF_EX_LINKER / 
> LF_GEN_LINKER) != null
>
>   * trigger Full GC
>
>   * check LF cache again (it will be empty if the bug is present)
>
>>   under hs-comp/test
>>      http://cr.openjdk.java.net/~jcm/8067247/webrev.hs_comp.00/
>
> Looks good.
>
> Best regards,
> Vladimir Ivanov
>
>>
>> Unit Test: test/compiler/jsr292/misc/gc/MHInvokeTest.java
>> Testing: JPRT with new test case, with fix, without fix
>>
>> Problem Summary:  MH.invoke linksite take assistance of java code to get
>> an adapter method. Here a new method holder class and a adapter method
>> are created for a MT and lform instance is cached.
>> Normally this cached lform get returned for a linksite request of same
>> MT.  When these cached lform get collected(due to memory pressure),  a
>> new class and method gets created for same MT(even though old method
>> holder class and  adapter method are live).
>> Fix Summary: Kept a strong reference to lform instance in adapter method
>> holder class of  MT.
>>
>> Best Regards,
>> Jamsheed
>>
>>
>>
>>



More information about the hotspot-compiler-dev mailing list