java - 从 java 设置 ulimit -n

标签 java jvm system-calls ulimit

我正在尝试设置我的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。

最佳答案

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

为了对自身应用新的限制,Java 进程应该调用 setrlimit在其自身的上下文中发挥作用。由于此函数没有 Java 包装器,因此只能通过 native 接口(interface)调用:JNI、JNA 或 JNR。

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

关于java - 从 java 设置 ulimit -n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55099287/

相关文章:

java - pl/sql 过程为 varchar2 列返回 3 个问号 ('???' ) (wls 10.3.4 - weblogic 11g)

Java JVM 默认垃圾收集器 : is it configured the same across different applications?

java - 访问修饰符在 JVM 内部如何工作?

c - 这个系统调用的跳转指令是什么?

c - C 中的 setbuf 函数

java - Servlet session 属性的多态性

java - xmlparserv2.jar 和 Oracle 数据库错误

java - Play 框架中的 POJO 到 JSON

java - 无法在 libjvm.dylib (Mac OS) 中找到方法 JNI_GetCreatedJavaVMs

linux - ARM 系统调用的接口(interface)是什么,它在 Linux 内核中的什么位置定义?