gpt4 book ai didi

java:ProcessBuilder 占用大量内存

转载 作者:搜寻专家 更新时间:2023-10-31 20:31:02 25 4
gpt4 key购买 nike

我有一些关于 ProcessBuilder 的问题。该程序基本上是一个调用命令行脚本的简单包装器。

通过终端自行运行脚本时,内存消耗保持在 2G 以下。通过java wrapper运行脚本时,内存消耗激增,甚至8G很快就被填满,导致内存不足的错误。

启动进程的代码很简单:

public static int execute(String command) throws IOException
{
System.out.println("Executing: " + command);

ProcessBuilder pb = new ProcessBuilder(command.split(" +"));
Process p = pb.start();

// display any output in stderr or stdout
StreamConsumer stderr = new StreamConsumer(p.getErrorStream(), "stderr");
StreamConsumer stdout = new StreamConsumer(p.getInputStream(), "stdout");
new Thread(stderr).start();
new Thread(stdout).start();

try {
return p.waitFor();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

StreamConsumer 类只是一个使用 stdout/stderr 流并将它们显示在控制台上的类。

...问题是:到底为什么内存消耗会爆炸?

问候,
阿诺

编辑:

  • 无论我使用 ProcessBuilder 还是Runtime.getRuntime.exec(...), 的结果是一样的。
  • 内存突发往往出现在由shell 脚本调用:
sort big-text-file > big-text-file.sorted

应 Jim Garrison 的要求编辑 2:

好的,这是我省略的 StreamConsumer 类,因为它相当简单:

class StreamConsumer implements Runnable
{
InputStream stream;
String descr;

StreamConsumer(InputStream stream, String descr) {
this.stream = stream;
this.descr = descr;
}

@Override
public void run()
{
String line;

BufferedReader brCleanUp =
new BufferedReader (new InputStreamReader (stream));

try {
while ((line = brCleanUp.readLine ()) != null)
System.out.println ("[" + descr + "] " + line);
brCleanUp.close();
} catch (IOException e) {
// TODO: handle exception
}
}
}

最佳答案

如果你像这样改变你的命令:sort -o big-text-file.sorted 大文本文件

总是一样吗?

关于java:ProcessBuilder 占用大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com