编写了一个快速的java程序来生成10个线程,每个线程具有10个优先级,并计算pi(4*atan(1)方法),每个线程使用50万次bigdecimals,连接每个线程并报告run方法的运行时间。是的,也许不是最好的例子,但要保持基本。
我知道bug4813310
在c中这样做是非常重要的,但是我们能假设在linux JVM上从来没有设置本机优先级吗?
$uname -r && grep bogomips /proc/cpuinfo
2.4.33.3
bogomips : 4312.26
$java -version 2>&1 |head -1
Java version "1.6.0_01"
$javac T.java && java -Xmx32m -XX:+UseThreadPriorities T
1:3112
2:2636
3:2662
4:3118
5:2870
6:3319
7:3412
8:3304
9:3299
10:3069
看起来并不像人们期望的那样有多大的偏差!那是在一个小型的虚拟linux机器上。也许只是孙的?我们将尝试ibm j9 vm:
1:4091
2:4142
3:3957
4:3905
5:3984
6:3985
7:4130
8:4055
9:3752
10:4071
相比之下,总数量看起来相当不错,但从线程优先级的Angular 来看,这些数量没有比例。
让我们在一个2.6内核上尝试500k次迭代,该内核使用的是一个较旧的sun jvm,一个不断加载平均负载很少低于7的jvm:
$uname -r && grep bogomips /proc/cpuinfo
2.6.9-67.ELsmp
bogomips : 3992.93
bogomips : 3990.00
$java -version 2>&1 |head -1
java version "1.4.2_14"
$javac T.java && java -Xmx32m -XX:+UseThreadPriorities T
1:63200
2:64388
3:62532
4:58529
5:62292
6:64872
7:64885
8:64584
9:61653
10:61575
让我们在一个真正的平板上试用ibm的j9,只使用2.6内核,因为它是一个更大的系统,所以我会将迭代次数增加到2000000次。
$uname -r && grep bogomips /proc/cpuinfo
2.6.9-78.ELsmp
bogomips : 5989.03
bogomips : 5985.03
bogomips : 5985.01
bogomips : 5985.02
bogomips : 5984.99
bogomips : 5985.02
bogomips : 5984.99
bogomips : 5985.02
$java -Xmx32m T # this is the IBM J9
1:1718
2:1569
3:1989
4:1897
5:1839
6:1688
7:1634
8:1552
9:2027
10:1522
一些伟大的时刻,但仍然没有明显的线程/进程优先级。
让我们试试windows盒子。我知道windows有一个相当激进的线程优先级方案。任何超乎寻常的轶事都会消耗更多。因此,让我们在每个线程中进行900000次迭代:
C:\>java -version
java version "1.6.0_11"
C:\>java -Xmx32m T
1:12578
2:12625
3:11469
4:11453
5:10781
6:8937
7:10516
8:8406
9:9953
10:7391
很像我们要找的,不是吗?
所以linux jvm显然没有线程优先级?我知道在c语言中你不可能真正达到一个较低的nice级别,但我认为jvm工程师应该已经知道如何保持一个较低nice级别的调度器。
3条答案
按热度按时间zbq4xfa01#
这只是一个小插曲,但是在jvm中设置线程优先级不需要调整操作系统线程的优先级吗?
linux(以及任何类似unix的操作系统)限制了将进程赋予root更高优先级的能力。我认为线程也会有类似的限制。
wlsrxk512#
好吧,让我们看看来源:
第2947行:
...
第2982行:
...
第2997行:
所以!至少在sunjava上,在linux上,你不会看到线程优先级,除非你已经做了
-XX:ThreadPriorityPolicy
这似乎需要根。j0pj023g3#
默认的linux线程调度程序策略sched\u other不支持优先级。或者更确切地说,它支持一个值为0的优先级设置。其他所谓的“实时”策略sched\u fifo和sched\u rr支持更高的优先级,但仅对具有超级用户权限的进程可用。