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
编辑:
Run Code Online (Sandbox Code Playgroud)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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2833 次 |
| 最近记录: |