-
Bug
-
Resolution: Fixed
-
P3
-
6
-
b77
-
generic
-
generic
<This causes JDI jtreg test
com/sun/jdi/ReferrersTest.java
to hang. See Comments for more info>
I'm opening this bug to track an e-mail thread between Jim, Ken
and I concerning a self-suspension deadlock. The original e-mail
message is here in the description. The various replies are in
the comments.
Hello Dan. I am looking (again) at netbeans problem with
doing an invokeMethod in a JDI bkpt handler.
Note that they said today that they get a hang even if they
do the invoke in a different thread. Huh? That should work ok.
So I tried it, and sure enough, I got a hang. But not the
same hang as discussed before when two threads are both hitting
bkpts. In this case, the debuggee has a main that
starts a thread and then does a thread.join.
The started thread hits a bkpt and in the debugger, the bkpt handler
starts up a new thread to do the invokeMethod.
In the debuggee, this thread is hung doing a println:
----------------- t@13 -----------------
0xff31f760 ___lwp_mutex_lock + 0x8
0xfe89d0b4 void Mutex::lock() + 0x148
0xfed429c4 HeapWord*CompactingPermGen::mem_allocate(unsigned) + 0x24
0xfeaf37cc oopDesc*CollectedHeap::permanent_obj_allocate(KlassHandle,int,Thread*) + 0x48
0xfe8e30cc instanceOopDesc*instanceKlass::allocate_permanent_instance(Thread*) + 0x64
0xfe8e7de8 Handle java_lang_String::create_tenured_from_unicode(unsigned short*,int,Thread*) + 0x2c
0xfe9a4b10 oopDesc*StringTable::basic_add(int,Handle,unsigned short*,int,unsigned,Thread*) + 0x6c
0xfed8d92c oopDesc*StringTable::intern(Handle,unsigned short*,int,Thread*) + 0x108
0xfe8e4a08 oopDesc*StringTable::intern(symbolOopDesc*,Thread*) + 0x40
0xfe8e3284 oopDesc*constantPoolOopDesc::string_at_impl(constantPoolHandle,int,Thread*) + 0x80
0xfeb68d6c void InterpreterRuntime::ldc(JavaThread*,bool) + 0x168
0xfc414df4 * InvokeBreakpointTarg.invokee() bci:3 line:45 (Interpreted frame)
It is waiting for the Heap_lock.
The main thread is hung here doing the Thread.join:
0xff31f7d8 ___lwp_cond_wait + 0x4
0xfed18720 bool Monitor::wait(bool,long) + 0x13c
0xfed29890 int os::pd_self_suspend_thread(Thread*) + 0xc
0xfed9d598 int JavaThread::java_suspend_self() + 0xc4
0xfed18d48 bool Monitor::wait(bool,long) + 0x764
0xfe9984ac void VMThread::execute(VM_Operation*) + 0x1b0
0xfeaa2d70 BiasedLocking::Condition BiasedLocking::revoke_and_rebias(Handle,bool,Thread*) + 0xa8
0xfe99e2c4 void ObjectSynchronizer::wait(Handle,long long,Thread*) + 0x50
0xfe99e048 JVM_MonitorWait + 0x294
0xfc4134fc * java.lang.Object.wait(long) bci:134425908 (Interpreted frame)
0xfc4134a8 * java.lang.Object.wait(long) bci:0 (Interpreted frame)
0xfc4057e8 * java.lang.Thread.join(long) bci:38 line:1111 (Interpreted frame)
0xfc4057e8 * java.lang.Thread.join() bci:2 line:1164 (Interpreted frame)
0xfc4057e8 * InvokeBreakpointTarg.main(java.lang.String[]) bci:43 line:39 (Interpreted frame)
0xfc40021c <StubRoutines>
0xfe8f78a0 void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*) + 0x1e0
0xfe9b74e8 jni_CallStaticVoidMethod + 0x500
0x00013220 main + 0x1d10
It owns the Heap_lock and is trying to do a VM op to do the revoke.
Recall that this is the same intermittent hang we saw for
jtreg InstancesTest.java for a few nightlys.
The VMThread::execute is calling wait (I don't know why) and wait, in
mutex_solaris.cpp is doing this:
// were we externally suspended while we were waiting?
if (jt->handle_special_suspend_equivalent_condition()) {
//
// Our event wait has finished and we own the _Lock_Event, but
// while we were waiting another thread suspended us. We don't
// want to hold the _Lock_Event while suspended because that
// would surprise the thread that suspended us.
//
_Lock_Event->unlock();
jt->java_suspend_self();
_Lock_Event->lock();
}
which Ken says this is a no-no and should be deleted (and ditto for
similar code in the other pd files).
Should we open a bug on this and have you fix it?
Thanks
- jjh
com/sun/jdi/ReferrersTest.java
to hang. See Comments for more info>
I'm opening this bug to track an e-mail thread between Jim, Ken
and I concerning a self-suspension deadlock. The original e-mail
message is here in the description. The various replies are in
the comments.
Hello Dan. I am looking (again) at netbeans problem with
doing an invokeMethod in a JDI bkpt handler.
Note that they said today that they get a hang even if they
do the invoke in a different thread. Huh? That should work ok.
So I tried it, and sure enough, I got a hang. But not the
same hang as discussed before when two threads are both hitting
bkpts. In this case, the debuggee has a main that
starts a thread and then does a thread.join.
The started thread hits a bkpt and in the debugger, the bkpt handler
starts up a new thread to do the invokeMethod.
In the debuggee, this thread is hung doing a println:
----------------- t@13 -----------------
0xff31f760 ___lwp_mutex_lock + 0x8
0xfe89d0b4 void Mutex::lock() + 0x148
0xfed429c4 HeapWord*CompactingPermGen::mem_allocate(unsigned) + 0x24
0xfeaf37cc oopDesc*CollectedHeap::permanent_obj_allocate(KlassHandle,int,Thread*) + 0x48
0xfe8e30cc instanceOopDesc*instanceKlass::allocate_permanent_instance(Thread*) + 0x64
0xfe8e7de8 Handle java_lang_String::create_tenured_from_unicode(unsigned short*,int,Thread*) + 0x2c
0xfe9a4b10 oopDesc*StringTable::basic_add(int,Handle,unsigned short*,int,unsigned,Thread*) + 0x6c
0xfed8d92c oopDesc*StringTable::intern(Handle,unsigned short*,int,Thread*) + 0x108
0xfe8e4a08 oopDesc*StringTable::intern(symbolOopDesc*,Thread*) + 0x40
0xfe8e3284 oopDesc*constantPoolOopDesc::string_at_impl(constantPoolHandle,int,Thread*) + 0x80
0xfeb68d6c void InterpreterRuntime::ldc(JavaThread*,bool) + 0x168
0xfc414df4 * InvokeBreakpointTarg.invokee() bci:3 line:45 (Interpreted frame)
It is waiting for the Heap_lock.
The main thread is hung here doing the Thread.join:
0xff31f7d8 ___lwp_cond_wait + 0x4
0xfed18720 bool Monitor::wait(bool,long) + 0x13c
0xfed29890 int os::pd_self_suspend_thread(Thread*) + 0xc
0xfed9d598 int JavaThread::java_suspend_self() + 0xc4
0xfed18d48 bool Monitor::wait(bool,long) + 0x764
0xfe9984ac void VMThread::execute(VM_Operation*) + 0x1b0
0xfeaa2d70 BiasedLocking::Condition BiasedLocking::revoke_and_rebias(Handle,bool,Thread*) + 0xa8
0xfe99e2c4 void ObjectSynchronizer::wait(Handle,long long,Thread*) + 0x50
0xfe99e048 JVM_MonitorWait + 0x294
0xfc4134fc * java.lang.Object.wait(long) bci:134425908 (Interpreted frame)
0xfc4134a8 * java.lang.Object.wait(long) bci:0 (Interpreted frame)
0xfc4057e8 * java.lang.Thread.join(long) bci:38 line:1111 (Interpreted frame)
0xfc4057e8 * java.lang.Thread.join() bci:2 line:1164 (Interpreted frame)
0xfc4057e8 * InvokeBreakpointTarg.main(java.lang.String[]) bci:43 line:39 (Interpreted frame)
0xfc40021c <StubRoutines>
0xfe8f78a0 void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*) + 0x1e0
0xfe9b74e8 jni_CallStaticVoidMethod + 0x500
0x00013220 main + 0x1d10
It owns the Heap_lock and is trying to do a VM op to do the revoke.
Recall that this is the same intermittent hang we saw for
jtreg InstancesTest.java for a few nightlys.
The VMThread::execute is calling wait (I don't know why) and wait, in
mutex_solaris.cpp is doing this:
// were we externally suspended while we were waiting?
if (jt->handle_special_suspend_equivalent_condition()) {
//
// Our event wait has finished and we own the _Lock_Event, but
// while we were waiting another thread suspended us. We don't
// want to hold the _Lock_Event while suspended because that
// would surprise the thread that suspended us.
//
_Lock_Event->unlock();
jt->java_suspend_self();
_Lock_Event->lock();
}
which Ken says this is a no-no and should be deleted (and ditto for
similar code in the other pd files).
Should we open a bug on this and have you fix it?
Thanks
- jjh
- duplicates
-
JDK-6392004 Self-suspension holding Heap_lock blocks the use of FollowReferences in agent thread
-
- Closed
-
- relates to
-
JDK-6293795 Backend hangs when invokeMethod is called from a JDI eventHandler
-
- Resolved
-
-
JDK-6474293 performance regression in -Xprof
-
- Closed
-