【发布时间】: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