设置在 linux 上运行的 Java 程序的 nice 值

Posted

技术标签:

【中文标题】设置在 linux 上运行的 Java 程序的 nice 值【英文标题】:Setting nice value of Java program running on linux 【发布时间】:2012-08-22 01:12:28 【问题描述】:

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

然后我想也许我会把它塞住并调用系统命令,但Thread.getId() 也只是 JVM 的 id,所以我什至不知道要传递给 renice 的进程 id。

Java 程序有没有办法做这样的事情?

【问题讨论】:

相关问题:Cross-platform way to change java process priority,没有肯定答案。 【参考方案1】:

如果你的程序是唯一运行的java程序,那么你可以运行

renice +5 `pgrep java`

【讨论】:

假设process nice-ness affects Java thread priority.【参考方案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

【讨论】:

那还是需要知道进程ID【参考方案4】:

另请查看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 中。

【讨论】:

【参考方案5】:

用途:

nice --adjustment=5 java whatever

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

【讨论】:

【参考方案6】:

我的建议是从 bash 脚本或启动/停止服务脚本调用您的 java 应用程序,然后在启动后找到进程 ID 并对其进行修改。

【讨论】:

以上是关于设置在 linux 上运行的 Java 程序的 nice 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在UltraEdit中编译和运行Java程序

java 应用程序在linux 上怎么部署 运行

谁会写在linux服务器上运行java程序的运行脚本

如何在 linux 的高 dpi 显示器上修复基于 java 的应用程序的缩放?

linux下怎么执行.jar程序

java应用程序在linux上运行无法自动退出