RFR (S): 8213397: Stack dump should show more clearly when a thread is blocked on a class initialization monitor
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Mon Jan 14 13:21:24 UTC 2019
On 1/14/19 8:13 AM, David Holmes wrote:
> Hi Coleen,
>
> On 14/01/2019 10:25 pm, coleen.phillimore at oracle.com wrote:
>>
>> This is a nice improvement.
>
> Thanks for taking a look.
>
>> http://cr.openjdk.java.net/~dholmes/8213397/webrev/src/hotspot/share/runtime/vframe.cpp.udiff.html
>>
>>
>> + // top-frame, so we should be waiting on a Class initialization
>> monitor.
>> + InstanceKlass* k = thread()->class_to_be_initialized();
>> + if (k != NULL) {
>> + st->print_cr("\t- waiting on the Class initialization monitor for
>> %s", k->external_name());
>> + }
>> + else {
>> + assert(false, "OBJECT_WAIT state is unexpected");
>> + }
>>
>>
>> Should be } else {
>>
>> And I don't think this should be an assert. There are a couple of
>> other places that we lock an object monitor from the VM, but I don't
>> think we wait in these places. In any case, if we add a wait, it
>> would take a lot of testing and a long time to get to this assert to
>> find it needs to add another case here. So if you remove the 'else'
>> completely and change the comment to "see if we are waiting on a
>> class initialization monitor" you don't need to fix the {}.
>
> Initially I thought the "else" might be some JNI or JVM TI case, but
> that's not so as there's no direct API to do wait(), it just requires
> invoking the Object.wait method. So at the moment the implicit else is
> "unreachable" and I wanted to convey that. I chose the assert in case
> I was wrong, or in the unlikely event a new VM internal call to wait()
> was ever added and we happened to encounter it. Leaving it empty to me
> raises the question "how do we get here?".
The thing is, that leaving an assert to find some future case is only
good if that code is going to execute frequently and we find it in
testing. This is not a frequent path. Having the assert might be hit
much later down the road when we've forgotten this. It's not helpful.
Thanks,
Coleen
>
> Thanks,
> David
>
>> Thanks,
>> Coleen
>>
>>
>>
>> On 1/14/19 1:01 AM, David Holmes wrote:
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8213397
>>> webrev: http://cr.openjdk.java.net/~dholmes/8213397/webrev/
>>>
>>> Please review this simple enhancement to improve the stack trace
>>> information when a thread is blocked doing a (logical) Object.wait
>>> on the monitor associated with Class static initialization.
>>>
>>> Details are in the bug report but basically we record, in a
>>> thread-local variable, the name of the class before the "wait" and
>>> clear it after, thus allowing the stack dump code to query it if it
>>> appears we may be in that situation.
>>>
>>> In InstanceKlass::initialize_impl I also refactored the code a tiny
>>> bit to make use of the JavaThread reference to the current thread.
>>>
>>> A new test using jstack was also added.
>>>
>>> Testing:
>>> - mach5 tiers 1 - 3
>>> - the new test on Windows/Linux/OSX x86 and Solaris sparc, in
>>> regular and Xcomp mode
>>> - All jstack/stack-dump using tests I could see (linux x64):
>>> - runtime/Thread
>>> - serviceability/sa/
>>> - serviceability/tmtools/jstack/
>>> - vmTestbase/nsk/jvmti/scenarios/sampling/
>>> - vmTestbase/nsk/jvmti/MonitorWaited/ .
>>> - vmTestbase/nsk/jvmti/GetOwnedMonitorInfo/
>>>
>>> Thanks,
>>> David
>>
More information about the hotspot-runtime-dev
mailing list