繁体   English   中英

设置在Linux上运行的Java程序的不错的价值

[英]Setting nice value of Java program running on linux

我希望我的Java程序将其优先级降低一些,以免使系统不堪重负。 我最初的想法是使用Thread.currentThread().setPriority(5)但这似乎只是它在JVM中的优先级。

然后,我想也许我会怀疑它并调用一个系统命令,但是Thread.getId()仅仅是JVM的ID,所以我什至不知道将哪个进程ID传递给renice

Java程序有什么办法可以做这样的事情吗?

如果您的程序是唯一正在运行的Java程序,则可以运行

renice +5 `pgrep java`

由于我们必须以依赖于平台的方式执行此操作,因此我从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吗? 很高兴见到你。

除了renice-您还可以使用ionice comand。 例如 :

ionice -c 3 -n 7 -p PID

另请参阅https://github.com/jnr/jnr-posix/

这个POSIX库应该允许您使用一些Linux Posix Nice函数,例如...

https://github.com/jnr/jnr-posix/blob/master/src/main/java/jnr/posix/LibC.java用于操作系统级别的setPriority(),即setpriority(2)

jnr-posix也位于Maven中。

采用:

nice --adjustment=5 java whatever

只需一步即可运行Java程序并分配优先级。

我的建议是从bash脚本或启动/停止服务脚本中调用Java应用程序,然后在启动后查找进程ID并重新启动它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM