SIGSEGV while Parse::optimize_inlining an invokedynamic call.
Sebastian Sickelmann
sebastian.sickelmann at gmx.de
Tue Sep 20 14:05:37 PDT 2011
Am 20.09.2011 13:19, schrieb Christian Thalinger:
> On Sep 19, 2011, at 11:09 AM, Christian Thalinger wrote:
>
>> [Moving hotspot-runtime-dev to Bcc]
>>
>> On Sep 17, 2011, at 9:05 PM, Sebastian Sickelmann wrote:
>>
>>> Hi,
>>> while doing further investigations on my idea [0] i observed a
>>> reproducable crash of the vm.
>>> It seems to me that it happens while the hotspot tries to inline (i
>>> think) a invokedynamic call.
>>> It happens only in my second Testcases (a case where an exception is
>>> thrown) so i tried
>>> to reduce it to a smaller amount of classes.
>>>
>>> I reduces the example of my idea to some core classes which i packed to [1].
>>> You can run the example starting the Main class. If you start it with
>>> -Xint no crash happens.
>>> I have packed it with the java-source or with disassembled classfile for
>>> the invokedynamic call.
>>>
>>> What is the Programm doing?
>>>
>>> Main starts TestNew2.testIt() 20000 times and prints out the thrown
>>> exception every time.
>>> TestNew2 is a generated class which does something like(just with out
>>> the local variable):
>>> NEW2 o = new NEW2();
>>> Throwable cause = INVOKEDYNAMIC cause (LNEW2;)Ljava/lang/Throwable;
>>> [Bootstrapper.getFunction(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
>>> (6)]
>>> // Which is effective cause = o.getCause();
>>> System.out.println(cause);
>>> Throwable newCause = new RuntimeException("NEW");
>>> INVOKEDYNAMIC cause (LNEW2;Ljava/lang/Throwable;)V
>>> [Bootstrapper.setFunction(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
>>> (6)]
>>> // Which is effective o.initCause(newCause) which throws the
>>> exception that is catched by Main.
>>> The Binding is done via the Bootstrapper class.
>>> It looks up if the field "NEW2.cause" can be accessed by
>>> TestNew2 which isn't the case and binds the two calls to the methods
>>> NEW2.getCause and NEW2.initCause.
>>>
>>>
>>> I have checked it with
>>> java version "1.7.0"
>>> Java(TM) SE Runtime Environment (build 1.7.0-b147)
>>> Java HotSpot(TM) Server VM (build 21.0-b17, mixed mode)
>>>
>>> i have put my hs_err_pid.log here [2].
>>>
>>> maybe b127 this is not the newest, but i didn't found a newer one. Maybe
>>> its the same problem as the porter-stemmer (don't interested me much
>>> till now) but -XX:-UseLoopPredicate (which i think should fix it) doen't
>>> solve it.
>>>
>>> I have cross-checked it also with my local openjdk8 builds.
>>>
>>> The builds are
>>> complete build of http://hg.openjdk.java.net/jdk8/jdk8 rev
>>> 28cf2aec4dd7
>>> and even if i don't think it's a hotspot problem i checked it also
>>> against my openjdk8 with http://hg.openjdk.java.net/jdk8/tl/jdk/
>>> rev 75d763111eec
>>>
>>> I am not 100% sure if the error is on my side or if it is on the vm,
>>> maybe i have done something wrong with the invokedynamic. But i think it
>>> is inside hotspot because hotspot / interpreted-mode should work the
>>> same way, isn't it?
>> I can reproduce the bug and it is a VM issue (more precisely a C2 issue). Although the synopsis mentions deoptimization this is very likely a duplicate of:
>>
>> 7055941: JSR 292 method handle invocation causes excessive deoptimization for types not on boot class path
> It's not a duplicate of 7055941. I filed:
>
> 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
>
> -- Christian
Is there a change to understand the details of this if i don't have
years of hotspot knowledge?
I anyway have the intention to have a closer look at hotspot to create a
prototype for my binary compatibility project i mentioned [1] on my
blog. I actually solve this in an experiment with byte-code
transformation (to invokedynamic) in PreMain, but i think it can solved
in a better way inside the vm.
And if i think about solving this also for
Reflection/MethodHandles$Lookup i think i have to dive into hotspot in
some more depth.
-- Sebasitan
[1] http://codingwizard.wordpress.com/2011/09/13/remove-flaws-in-java-apis/
[0]
More information about the mlvm-dev
mailing list