"nice" 是否影响 Java 线程的优先级

Does "nice" affect the priority of Java threads

在 Unix 系统上,您可以 运行 较低 CPU“优先级”的进程(迂腐地,它不会改变所谓的 priority,而是影响使用CPU可用时间的份额,这是一般意义上的“优先级”)使用nice命令:

 nice program

您可以将其用于 运行 JVM 进程:

 nice java -jar program.jar

该 JVM 进程的 Java 程序 运行 将启动多个线程。

nice 更改是否会影响那些 Java 线程的调度?也就是说,当 运行 as

时,Java 线程是否具有较低的 CPU 优先级
 nice java -jar program.jar

当 运行 为

 java -jar program.jar

一般来说,这将取决于系统,所以我对 Linux 案例感兴趣。

根据 ps 的报告,niceness 应用于 java 线程。我 运行 使用等待用户输入的 java 应用程序进行此快速测试:

开始进程:nice -n 19 java Main
ps -m -l 20746

的输出
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
0 -  1000 20746 10006  0   -   - - 1739135 -    pts/2      0:00 java Main
0 S  1000     -     -  0  99  19 -     - futex_ -          0:00 -
1 S  1000     -     -  0  99  19 -     - wait_w -          0:00 -
1 S  1000     -     -  0  99  19 -     - futex_ -          0:00 -
1 S  1000     -     -  0  99  19 -     - futex_ -          0:00 -

开始进程:nice -n 15 java Main
ps -m -l 21488

的输出
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
0 -  1000 21488 10006  0   -   - - 1722494 -    pts/2      0:00 java Main
0 S  1000     -     -  0  95  15 -     - futex_ -          0:00 -
1 S  1000     -     -  0  95  15 -     - wait_w -          0:00 -
1 S  1000     -     -  0  95  15 -     - futex_ -          0:00 -
1 S  1000     -     -  0  95  15 -     - futex_ -          0:00 -

NI 列似乎反映了我传递给 nice 的内容,优先级也相应地发生了变化。我使用 jps.

获得了进程 ID (20746, 21488)

注意运行 jstack 21488例如不会给出以上信息

我 运行 以上 Ubuntu 16.04 LTS(64 位)

实际上...Niceness 是 属性 根据 POSIX.1 的应用。这里有更详细的post。 is nice() used to change the thread priority or the process priority?

Java 并不特别。这只是一个进程,OS 设置其 "niceness" 的方式与任何其他进程相同。

在 Linux 上,Java 线程是使用本机线程实现的,因此,"niceness" 同样受 OS 控制,方式与任何其他本机线程相同.