从java设置ulimit -n

问题描述 投票:0回答:2

我正在尝试设置我的java程序运行的ulimit。目前,似乎ulimit -n设置为4096,因为当我运行此代码(这是我的java程序的一部分)时,它输出4096。

ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", "ulimit -n");
try {
  Process process = processBuilder.start();
  // Prints 4096.
  LOGGER_.info(getStringFromInputStream(process.getInputStream()));
} catch (IOException e) {
  // The flow does not reach this catch block.
  LOGGER_.error("exception caught: " + e.getMessage());
}

是否可以将其更改为其他内容,例如8192?我试过这个:

ProcessBuilder processBuilder2 = new ProcessBuilder("/bin/bash", "-c", "ulimit -n 8192");
try {
  Process process = processBuilder2.start();
  LOGGER_.error("starting agent2...");
  LOGGER_.error(getStringFromInputStream(process.getInputStream()));
} catch (IOException e) {
  LOGGER_.error("exception caught2: " + e.getMessage());
}

try {
  String[] cmdString = new String[3];
  cmdString[0] = "/bin/bash";
  cmdString[1] = "-c";
  cmdString[2] = "ulimit -n 8192";
  Process process = Runtime.getRuntime().exec(cmdString);
  LOGGER_.error(getStringFromInputStream(process.getInputStream()));
} catch (IOException e) {
  LOGGER_.error("exception caught:" + e.getMessage());
}

但我不确定这些是否是正确的方法。此外,如果ulimit -n甚至被修改。

java jvm system-calls ulimit
2个回答
1
投票

ulimit命令更新当前进程和所有继承进程的限制。当您使用ulimitRuntime.exec调用ProcessBuilder时,它会启动一个新进程并更新此新进程的限制,而不会影响当前的Java进程。

为了对自身应用新的限制,Java进程应该在自己的上下文中调用setrlimit函数。由于此函数没有Java包装器,因此只能通过本机接口调用它:JNI,JNA或JNR。

但是,如果Java在非特权用户下运行,则无论如何更新文件限制(ulimit -n)都是无用的,因为HotSpot JVM会自动将此限制更新为最大允许值 - 请参阅this question


0
投票

我做了一个有效的解决方法。我使用的是执行java程序的shell脚本。所以,我在shell脚本执行running-the-java部分之前设置了ulimit。正如@apangin所说,这设置了shell进程的ulimit和从这个shell进程生成的java进程,继承了这个ulimit。

© www.soinside.com 2019 - 2024. All rights reserved.