如果我直接从命令行启动一个特定的进程,我会看到它在2-3秒内完全启动。
如果我从Java程序使用完全相同的命令启动完全相同的进程,它会在启动时挂起,除非父进程被销毁。为什么?
使用ProcessBuilder:
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.directory(new File(dir));
Process p = pb.start();使用Runtime.exec:
Runtime.getRuntime().exec(cmd, null, new File(dir));无论哪种方式,如果我没有将新的进程对象设置为null并立即调用垃圾收集器,新进程将花费3分钟来完成它应该在3秒内完成的相同工作。
Process p = pb.start();
p = null;
Runtime.getRuntime().gc();使用上面的代码解决了这个问题。有人能给我解释一下原因吗?我认为这与JVM和进程处理有关,但这只是一个猜测。
新进程使用Hibernate连接到MySQL DB,使用log4j写入日志文件,从.properties文件读取并连接到RabbitMQ服务器。
谢谢,
祝您今天愉快
发布于 2011-12-07 23:16:34
从Java应用程序运行外部程序是出了名的难以正确执行。
我推荐使用高质量的Apache Commons Exec library。
如果您希望避免在代码中添加依赖项,至少要看看Exec library's Java code,看看它是如何创建和运行进程的。
发布于 2011-12-07 23:18:00
也许你的子进程需要一些来自stdin的输入?因此它会挂起,直到p.getOutputStream().write()提供输入
或者,它可以等到它的stdout被使用。
https://stackoverflow.com/questions/8417062
复制相似问题