The INDY-fication of string concatenation has triggered a problem where
a JVM TI agent's monitor-wait/ed callback hits an error path that uses
string concat which triggers a mass of indy related initialization,
which in turn hits monitor use in
MethodType$ConcurrentWeakInternSet.get, which causes the VM monitor
subsystem to be re-entered (and it is not reentrant!) so we crash. (log
extract below - the amount of code to process this is truly scary!)
I'm trying to workaround the problem by forcing some earlier string
concat in the thread in which the callback will execute. From what I can
see the test already does:
log(Thread.currentThread() + "some text");
but the error code is doing:
log("Agent '" + agentName + "' finished execution (finishedSuccessfully:
" + finishedSuccessfully + ")");
where finishedSuccessfully is a boolean, and so we have a different form
of makeConcatWithConstants call site.
I assume I can cover the exact case above by replicating it? But can I
generalize it to cover arbitrary string concat expressions that might
arise on other error paths?
And yes I realize this error code could hit monitor use in numerous
other places, but so far this is the only case that we have seen
trigger. (Though I can't reproduce it - even if I force the error path
to be taken.)
Thanks,
David
-----
V [jvm.dll+0x3ba688] report_vm_error+0x48;;
?report_vm_error@@YAXPBDH00ZZ+0x48
V [jvm.dll+0x7608f0] ObjectMonitor::enter+0x170;;
?enter@ObjectMonitor@@QAEXPAVThread@@@Z+0x170
V [jvm.dll+0x862035] ObjectSynchronizer::slow_enter+0x1d5;;
?slow_enter@ObjectSynchronizer@@SAXVHandle@@PAVBasicLock@@PAVThread@@@Z+0x1d5
V [jvm.dll+0x85fe8f] ObjectSynchronizer::fast_enter+0xff;;
?fast_enter@ObjectSynchronizer@@SAXVHandle@@PAVBasicLock@@_NPAVThread@@@Z+0xff
V [jvm.dll+0x2b5412] Runtime1::monitorenter+0x1e2;;
?monitorenter@Runtime1@@CAXPAVJavaThread@@PAVoopDesc@@PAVBasicObjectLock@@@Z+0x1e2
v ~RuntimeStub::monitorenter_nofpu Runtime1 stub
J 192 c1
java.lang.invoke.MethodType$ConcurrentWeakInternSet.get(Ljava/lang/Object;)Ljava/lang/Object;
java.base@9-internal (54 bytes) @ 0x0242d7da [0x0242d4c0+0x0000031a]
J 190 c1
java.lang.invoke.MethodType.makeImpl(Ljava/lang/Class;[Ljava/lang/Class;Z)Ljava/lang/invoke/MethodType;
java.base@9-internal (66 bytes) @ 0x0242ca20 [0x0242c9a0+0x00000080]
J 255 c1
java.lang.invoke.MemberName.getMethodOrFieldType()Ljava/lang/invoke/MethodType;
java.base@9-internal (72 bytes) @ 0x02445238 [0x02444f20+0x00000318]
J 239 c1
java.lang.invoke.InvokerBytecodeGenerator.isStaticallyInvocable(Ljava/lang/invoke/MemberName;)Z
java.base@9-internal (169 bytes) @ 0x0243dc28 [0x0243d820+0x00000408]
j java.lang.invoke.InvokerBytecodeGenerator.addMethod()V+648
java.base@9-internal
j
java.lang.invoke.InvokerBytecodeGenerator.generateCustomizedCodeBytes()[B+6
java.base@9-internal
j
java.lang.invoke.InvokerBytecodeGenerator.generateCustomizedCode(Ljava/lang/invoke/LambdaForm;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MemberName;+25
java.base@9-internal
j java.lang.invoke.LambdaForm.compileToBytecode()V+69 java.base@9-internal
j java.lang.invoke.LambdaForm.prepare()V+21 java.base@9-internal
j
java.lang.invoke.MethodHandle.<init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/LambdaForm;)V+33
java.base@9-internal
j
java.lang.invoke.BoundMethodHandle.<init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/LambdaForm;)V+3
java.base@9-internal
j
java.lang.invoke.BoundMethodHandle$Species_L9.<init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/LambdaForm;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+3
java.base@9-internal
j
java.lang.invoke.BoundMethodHandle$Species_L9.copyWith(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/LambdaForm;)Ljava/lang/invoke/BoundMethodHandle;+42
java.base@9-internal
j
java.lang.invoke.MethodHandles.dropArguments0(Ljava/lang/invoke/MethodHandle;ILjava/util/List;)Ljava/lang/invoke/MethodHandle;+105
java.base@9-internal
j
java.lang.invoke.MethodHandles.dropArguments(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;+6
java.base@9-internal
j
java.lang.invoke.StringConcatFactory$MethodHandleInlineCopyStrategy.generate(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/StringConcatFactory$Recipe;)Ljava/lang/invoke/MethodHandle;+479
java.base@9-internal
j
java.lang.invoke.StringConcatFactory.generate(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/StringConcatFactory$Recipe;)Ljava/lang/invoke/MethodHandle;+101
java.base@9-internal
j
java.lang.invoke.StringConcatFactory.doStringConcat(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;ZLjava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;+507
java.base@9-internal
j
java.lang.invoke.StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;+71
java.base@9-internal
j
java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+18
java.base@9-internal
j
java.lang.invoke.LambdaForm$BMH.reinvoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+48
java.base@9-internal
j
java.lang.invoke.Invokers$Holder.invoke_MT(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+26
java.base@9-internal
j
java.lang.invoke.CallSite.makeSite(Ljava/lang/invoke/MethodHandle;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/invoke/CallSite;+134
java.base@9-internal
j
java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(Ljava/lang/Class;Ljava/lang/invoke/MethodHandle;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/invoke/MemberName;+6
java.base@9-internal
j
java.lang.invoke.MethodHandleNatives.linkCallSite(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/invoke/MemberName;+45
java.base@9-internal
v ~StubRoutines::call_stub
V [jvm.dll+0x526f80] JavaCalls::call_helper+0x390;;
?call_helper@JavaCalls@@CAXPAVJavaValue@@ABVmethodHandle@@PAVJavaCallArguments@@PAVThread@@@Z+0x390
V [jvm.dll+0x7777c5] os::os_exception_wrapper+0xb5;;
?os_exception_wrapper@os@@SAXP6AXPAVJavaValue@@ABVmethodHandle@@PAVJavaCallArguments@@PAVThread@@@Z0123@Z+0xb5
V [jvm.dll+0x526bdb] JavaCalls::call+0x5b;;
?call@JavaCalls@@SAXPAVJavaValue@@ABVmethodHandle@@PAVJavaCallArguments@@PAVThread@@@Z+0x5b
V [jvm.dll+0x527349] JavaCalls::call_static+0xc9;;
?call_static@JavaCalls@@SAXPAVJavaValue@@VKlassHandle@@PAVSymbol@@2PAVJavaCallArguments@@PAVThread@@@Z+0xc9
V [jvm.dll+0x864617]
SystemDictionary::find_dynamic_call_site_invoker+0x687;;
?find_dynamic_call_site_invoker@SystemDictionary@@SA?AVmethodHandle@@VKlassHandle@@VHandle@@PAVSymbol@@2PAV4@3PAVThread@@@Z+0x687
V [jvm.dll+0x65eb84] LinkResolver::resolve_dynamic_call+0x44;;
?resolve_dynamic_call@LinkResolver@@SAXAAVCallInfo@@VHandle@@PAVSymbol@@2VKlassHandle@@PAVThread@@@Z+0x44
V [jvm.dll+0x66014e] LinkResolver::resolve_invokedynamic+0x35e;;
?resolve_invokedynamic@LinkResolver@@CAXAAVCallInfo@@ABVconstantPoolHandle@@HPAVThread@@@Z+0x35e
V [jvm.dll+0x65fd7e] LinkResolver::resolve_invoke+0x8e;;
?resolve_invoke@LinkResolver@@SAXAAVCallInfo@@VHandle@@ABVconstantPoolHandle@@HW4Code@Bytecodes@@PAVThread@@@Z+0x8e
V [jvm.dll+0x51eb0b] InterpreterRuntime::resolve_invokedynamic+0x7b;;
?resolve_invokedynamic@InterpreterRuntime@@CAXPAVJavaThread@@@Z+0x7b
V [jvm.dll+0x51dee4] InterpreterRuntime::resolve_from_cache+0xd4;;
?resolve_from_cache@InterpreterRuntime@@SAXPAVJavaThread@@W4Code@Bytecodes@@@Z+0xd4
j
nsk.share.aod.TargetApplicationWaitingAgents.agentFinished(Ljava/lang/String;Z)V+131
v ~StubRoutines::call_stub
V [jvm.dll+0x526f80] JavaCalls::call_helper+0x390;;
?call_helper@JavaCalls@@CAXPAVJavaValue@@ABVmethodHandle@@PAVJavaCallArguments@@PAVThread@@@Z+0x390
V [jvm.dll+0x7777c5] os::os_exception_wrapper+0xb5;;
?os_exception_wrapper@os@@SAXP6AXPAVJavaValue@@ABVmethodHandle@@PAVJavaCallArguments@@PAVThread@@@Z0123@Z+0xb5
V [jvm.dll+0x526bdb] JavaCalls::call+0x5b;;
?call@JavaCalls@@SAXPAVJavaValue@@ABVmethodHandle@@PAVJavaCallArguments@@PAVThread@@@Z+0x5b
V [jvm.dll+0x597f9a] jni_invoke_static+0x1ba;;
?jni_invoke_static@@YAXPAUJNIEnv_@@PAVJavaValue@@PAV_jobject@@W4JNICallType@@PAU_jmethodID@@PAVJNI_ArgumentPusher@@PAVThread@@@Z+0x1ba
V [jvm.dll+0x57f125] jni_CallStaticVoidMethod+0x1f5;;
_jni_CallStaticVoidMethod+0x1f5
C [attach037Agent00.dll+0x1167]
V [jvm.dll+0x7621cd] ObjectMonitor::wait+0x3bd;;
?wait@ObjectMonitor@@QAEX_J_NPAVThread@@@Z+0x3bd