RFR 8030847: java/lang/management/ThreadMXBean/ThreadBlockedCount.java fails intermittently again
David Holmes
david.holmes at oracle.com
Wed Jan 8 03:43:04 PST 2014
On 8/01/2014 9:39 PM, Jaroslav Bachorik wrote:
> On 8.1.2014 12:35, David Holmes wrote:
>> On 8/01/2014 7:51 PM, Jaroslav Bachorik wrote:
>>> On 8.1.2014 10:26, David Holmes wrote:
>>>>>> getBlockedCount(): Returns the total number of times that the thread
>>>>>> associated with this ThreadInfo blocked to enter or reenter a
>>>>>> monitor.
>>>>>>
>>>>>> None of CyclicBarrier/Phaser etc are monitors, so the BlockedCount
>>>>>> should not be being updated. If it is then that is a spec or
>>>>>> implementation bug in itself :(
>>>>>
>>>>> Indeed, it seems so. I've run the test with JFR enabled and one can
>>>>> distinctively see that the test fails when the thread is parked as it
>>>>> puts the thread into the "blocked" state in the end. I've also patched
>>>>> JVM (the attached monitor-contention.patch; applies to the hotspot
>>>>> repository) to report the thread going into "blocked" state and
>>>>> printing
>>>>> the actual stack trace at that moment and it also shows that the
>>>>> thread
>>>>> goes to "blocked" state somewhere from the "park()" code.
>>>>>
>>>>> I am attaching the JFR recordings - one for the failing test and one
>>>>> for
>>>>> the successful test.
>>>>>
>>>>> IMO, it seems that the ThreadInfo was not updated to reflect the
>>>>> introduction of the park()/unpark() methods. In the current state it
>>>>> mistakenly reports parking a thread as blocking but if the
>>>>> implementation is updated to include only blocking on monitor entry
>>>>> (to
>>>>> correspond to the API docs) we will miss the information about the
>>>>> thread being parked (when the thread also does not execute any user
>>>>> code). This would most probably call for the update of ThreadInfo API.
>>>>
>>>> park() puts you in Thread.State WAITING which is exposed via
>>>> ThreadInfo.getWaitedCount, so I don't see any issue there. If
>>>> parking is
>>>> causing a change to the blocked count then that is a major bug in the
>>>> underlying MXBean implementation.
>>>
>>> Ok, so there must be something else. According the debug output I added
>>> to share/vm/services/threadService.hpp in contended_enter_begin(thread)
>>> method I can see the thread being blocked here:
>>
>> Was the debug output System.out/err.println? It uses synchronization
>> internally so your debug statements may be the cause of the extra block
>> count updates.
>
> No. The output comes from inside the VM native code. Using tty->print().
Okay.
> But the contention handler method contended_enter_begin(thrd) enters
> before any output is generated.
It should be easy enough to report the stack whenever the blocked count
is updated for a thread.
David (signing off for the night)
-----
> I removed all the System.out/err.println() statements from the test code
> because they were causing much more blocked events.
>
> -JB-
>
>>
>> David
>> -----
>>
>>> 1. Might be related to class loading? The code being called at the
>>> reported line is "LockSupport.unpark(t)"
>>> ***
>>> Blocking on object [I
>>> =============================================================
>>> [Contended thread] BlockedThread
>>> at java.util.concurrent.Phaser.releaseWaiters(Phaser.java:982)
>>> at
>>> java.util.concurrent.Phaser.arriveAndAwaitAdvance(Phaser.java:705)
>>> at
>>> threads.ThreadBlockedCount1$BlockedThread.run(ThreadBlockedCount1.java:99)
>>>
>>>
>>> [Blocked count] 1
>>> ***
>>>
>>> 2. This report is missing information about the lock and the contended
>>> thread. I was not able to figure out how to easily print the information
>>> if the current thread is not the contended thread
>>> ***
>>> at java.util.concurrent.Phaser.internalAwaitAdvance(Phaser.java:1067)
>>> at
>>> java.util.concurrent.Phaser.arriveAndAwaitAdvance(Phaser.java:690)
>>> at
>>> threads.ThreadBlockedCount1$BlockedThread.run(ThreadBlockedCount1.java:104)
>>>
>>>
>>> - locked <0x00000000d6e108e0> (a java.lang.Object)
>>> [Blocked count] 1
>>> ***
>>>
>>>
>>> One of those reports can be seen in the debug output when the test
>>> fails.
>>>
>>> -JB-
>>>
>>>>
>>>> David
>>>> -----
>>>>
>>>>> -JB-
>>>>>
>>>>>>
>>>>>> David
>>>>>
>>>
>
More information about the serviceability-dev
mailing list