【问题标题】:Java - ProcessBuilder Doesn't Pass -XX:MaxDirectMemorySize To The JVMJava - ProcessBuilder 不将 -XX:MaxDirectMemorySize 传递给 JVM
【发布时间】:2020-06-12 17:55:37
【问题描述】:

我有一个 Java 程序由于缺少直接内存而出现 OutOfMemoryError。 当我将 -XX:MaxDirectMemorySize 设置为更大的内存大小时,它可以很容易地修复。从命令行可以正常工作:

java -XX:MaxDirectMemorySize=1024m -jar launcher1.4.5.jar

但是,当我使用 ProcessBuilder 使用相同的开关运行相同的程序时,即使我设置了 -XX:MaxDirectMemorySize 开关,我仍然会得到相同的 OutOfMemoryError。

List<String> command = new ArrayList<String>();
command.add("java");
command.add("-XX:MaxDirectMemorySize=1024m");
command.add("-Xmx1024m");
command.add("-jar");
command.add("launcher1.4.5.jar");

ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command(command);
File log = new File("log");
if(log.exists()) {
    log.delete();
}
processBuilder.redirectErrorStream(true);
processBuilder.redirectOutput(ProcessBuilder.Redirect.appendTo(log));
Process process = processBuilder.start();

StreamGobbler sg = new StreamGobbler(process.getInputStream(),System.out::println);
Executors.newSingleThreadExecutor().submit(sg);
int exitCode = process.waitFor();
System.out.printf("Program ended with exitCode %d", exitCode);

现在,如果我将“java -XX:MaxDirectMemorySize=1024m -jar launcher1.4.5.jar”传递给 bat 文件并使用 ProcessBuilder 运行该 bat 文件,它将正常工作。 所以问题是 ProcessBuilder 在运行 jar 文件时没有向 JVM 发送 -XX:MaxDirectMemorySize 开关

【问题讨论】:

  • 你如何确定这个?
  • 我在您的代码中没有看到java 命令
  • 抱歉修复了示例代码
  • 这样更好!!!
  • 虽然看起来不重要,但仍然:当你运行java -XX:MaxDirectMemorySize=1024m -Xmx1024m -jar launcher1.4.5.jar时会发生什么?您只为ProcessBuilder 命令设置了-Xmx,而不为您的其他试验设置了-Xmx

标签: java out-of-memory processbuilder


【解决方案1】:

好的,所以看起来这个奇怪问题的根本原因是由于 Java 安装似乎是 32 位。将其更改为 64 位,现在一切正常。 我使用以下方法进行了检查:

java -XshowSettings:properties -version

【讨论】: