【问题标题】:Setting nice value of Java program running on linux设置在 linux 上运行的 Java 程序的 nice 值
【发布时间】:2012-08-22 01:12:28
【问题描述】:
我希望我的 Java 程序将其优先级降低一些,以免系统不堪重负。我最初的想法是使用Thread.currentThread().setPriority(5),但这似乎只是它在 JVM 中的优先级。
然后我想也许我会把它塞住并调用系统命令,但Thread.getId() 也只是 JVM 的 id,所以我什至不知道要传递给 renice 的进程 id。
Java 程序有没有办法做这样的事情?
【问题讨论】:
标签:
java
linux
thread-priority
【解决方案1】:
如果你的程序是唯一运行的java程序,那么你可以运行
renice +5 `pgrep java`
【解决方案2】:
由于我们必须以依赖于平台的方式执行此操作,因此我从 java 运行了一个 shell 进程,它重新定义了它的父进程。父进程恰好是我们的 java 进程。
import java.io.*;
public class Pid
{
public static void main(String sArgs[])
throws java.io.IOException, InterruptedException
{
Process p = Runtime.getRuntime().exec(
new String[] {
"sh",
"-c",
"renice 8 `ps h -o ppid $$`"
// or: "renice 8 `cat /proc/$$/stat|awk '{print $4}'`"
}
);
// we're done here, the remaining code is for debugging purposes only
p.waitFor();
BufferedReader bre = new BufferedReader(new InputStreamReader(
p.getErrorStream()));
System.out.println(bre.readLine());
BufferedReader bro = new BufferedReader(new InputStreamReader(
p.getInputStream()));
System.out.println(bro.readLine());
Thread.sleep(10000);
}
}
顺便说一句:你是 jEdit 的 Brad Mace 吗?很高兴认识你。
【解决方案3】:
除了 renice - 您还可以使用 ionice 命令。例如:
ionice -c 3 -n 7 -p PID
【解决方案5】:
用途:
nice --adjustment=5 java whatever
只需一步即可运行您的 java 程序并分配优先级。
【解决方案6】:
我的建议是从 bash 脚本或启动/停止服务脚本调用您的 java 应用程序,然后在启动后找到进程 ID 并对其进行修改。