Review request for 6977034 Thread.getState() very slow

Brian Goetz brian.goetz at oracle.com
Sun Dec 5 07:27:13 UTC 2010


As Eamonn writes it, it will never cache miss but may frequently branch 
mispredict (possibly multiple times).  If you do a shift + mask + index into a 
small table, it will cache miss most the time but never branch mispredict. 
(In a real program it will cache miss frequently since thread state calls are 
infrequent and the lookup table will fall out of cache; in a microbenchmark it 
will almost never cache miss as the lookup table will be hot.)

On 12/4/2010 7:22 AM, Eamonn McManus wrote:
> Hi Mandy,
>
> This test:
>
>          if ((threadStatus&  JVMTI_THREAD_STATE_RUNNABLE) == 1) {
>
> is always false, since JVMTI_THREAD_STATE_RUNNABLE is 4. (NetBeans 7.0
> helpfully flags this; I'm not sure if earlier versions do.)
>
> But, once corrected, I think you could use this idea further to write a much
> simpler and faster method, on these lines:
>
>      public static Thread.State toThreadState(int threadStatus) {
>          if ((threadStatus&  JVMTI_THREAD_STATE_RUNNABLE)*!= 0*) {
>              return RUNNABLE;
>          } else if ((threadStatus&  JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) != 0) {
>              return BLOCKED;
>          } else if ((threadStatus&  JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) != 0) {
>              return TIMED_WAITING;
>          } else if ((threadStatus&  JVMTI_THREAD_STATE_WAITING_INDEFINITELY) != 0) {
>              return WAITING;
>          } else if ((threadStatus&  JVMTI_THREAD_STATE_TERMINATED) != 0) {
>              return TERMINATED;
>          } else {
>              return NEW;
>          }
>      }
>
> You could tweak the order of the tests based on what might be the relative
> frequency of the different states but it probably isn't worth it.
>
> Regards,
>
> Éamonn
>
>
> On 3/12/10 11:52 PM, Mandy Chung wrote:
>> Fix for 6977034: Thread.getState() very slow
>>
>> Webrev at:
>> http://cr.openjdk.java.net/~mchung/6977034/webrev.00/
>>
>> This is an improvement to map a Thread's threadStatus field to Thread.State.
>> The VM updates the Thread.threadStatus field directly at state transition
>> with the value as defined in JVM TI [1]. The java.lang.Thread.getState()
>> implementation can directly access the threadStatus value and do a direct
>> lookup from an array of Thread.State. The threadStatus value is a bit vector
>> and we would have to create an array of a minimum of 1061 (0x425) elements
>> to do direct mapping. I took the approach to use the first highest order bit
>> set to 1 in the masked threadStatus value as the index to the Thread.State
>> element and only caches 32 elements (could be fewer). I wrote a
>> micro-benchmark measuring the Thread.getState of a thread in different state
>> that shows 1.7X to 6X speedup (see below). There is possibly some issue with
>> my micro-benchmark that I didn't observe the 14X speed up as Doug did in his
>> experiment. However, I'd like to get this reviewed and pushed to the
>> repository so that anyone can do more experiment on the performance measurement.
>>
>> Thanks
>> Mandy
>> P.S. The discussion on this thread can be found at [2] [3].
>>
>> [1] http://download.java.net/jdk7/docs/platform/jvmti/jvmti.html#GetThreadState
>> [2] http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-July/004567.html
>> [3] http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-August/004721.html
>>
>>
>> 	JDK 7 b120 (in ms)	With fix (in ms)	Speed up
>> main		46465	        22772			2.04
>> NEW		50676		29921			1.69
>> RUNNABLE	42202		14690			2.87
>> BLOCKED		72773		12296			5.92
>> WAITING		48811		13041			3.74
>> TIMED_WAITING	45737		12849			3.56
>> TERMINATED	40314		16376			2.46
>>



More information about the core-libs-dev mailing list