3

如果我直接从命令行启动特定进程,我会看到它在 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));

无论哪种方式,如果我没有将新的 Process 对象设置为 null 并立即调用垃圾收集器,那么新进程最多需要 3 分钟才能完成它应该在 3 秒内完成的相同操作。

Process p = pb.start();
p = null;
Runtime.getRuntime().gc();

使用上面的代码解决了这个问题。有人可以解释我为什么吗?我认为这与 JVM 进程处理有关,但这只是一个猜测。

新进程使用 Hibernate 连接到 MySQL DB,使用 log4j 写入日志文件,从 .properties 文件中读取并连接到 RabbitMQ 服务器。

谢谢,

祝你今天过得愉快

4

2 回答 2

1

从 Java 应用程序运行外部程序是出了名的棘手。

我推荐使用高质量的Apache Commons Exec 库

如果您想避免在代码中添加依赖项,请至少查看Exec 库的 Java 代码以了解它是如何创建和运行进程的。

于 2011-12-07T15:16:33.573 回答
0

也许您的子进程需要来自标准输入的一些输入?所以它会挂起,直到p.getOutputStream().write()提供输入

或者它可以等到它的标准输出被消耗。

于 2011-12-07T15:17:59.733 回答