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

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Fri Mar 25 18:42:00 UTC 2016


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