java:ProcessBuilder使内存耗尽

dag*_*ies 5 java processbuilder

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

当通过终端自行运行脚本时,内存消耗保持在2G以下.通过java包装器运行脚本时,内存消耗会爆炸,甚至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); 
  }
 }
Run Code Online (Sandbox Code Playgroud)

StreamConsumer类只是一个消耗stdout/stderr流并在控制台上显示它们的类.

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

此致,
Arnaud

编辑:

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

根据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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 2

如果您像这样更改命令:sort -o big-text-file.sorted big-text-file

总是一样吗?