如果启动Java进程后不销毁父进程,那么Java进程的启动速度会极其缓慢。

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));

无论如何,如果我不将新进程对象设置为null并立即调用垃圾收集器,那么新进程需要3分钟才能完成原本只需3秒钟完成的任务。
Process p = pb.start();
p = null;
Runtime.getRuntime().gc();

使用上述代码可以解决这个问题。有人能够解释一下为什么吗?我认为这可能与JVM和进程处理有关,但这只是我的猜测。
新的进程使用Hibernate连接到MySQL数据库,使用log4j编写日志文件,从.properties文件中读取并连接到RabbitMQ服务器。
谢谢您,祝您有愉快的一天。
2个回答

1

从Java应用程序中运行外部程序通常很难做到完美。

我建议使用高质量的Apache Commons Exec库

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


1
谢谢,但我不在寻找替代方案,我只是好奇为什么会发生这种情况。 - grog

0

也许您的子进程需要从标准输入获取一些输入?因此,它会一直挂起,直到通过 p.getOutputStream().write() 提供输入为止。

或者它可以等待其标准输出被消耗。


不,我是通过“java -jar <program>.jar file.properties”启动程序的。从未请求任何输入。 - grog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接