簡體   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