繁体   English   中英

如果父启动它后没有销毁它,Java process.start会非常慢

[英]Java process.start slows down extremely if parent is not destroyed after launching it

如果我直接从命令行启动一个特定的进程,我发现它完全在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数据库,使用log4j写入日志文件,从.properties文件读取并连接到RabbitMQ服务器。

谢谢,

祝你今天愉快

从Java应用程序运行外部程序是非常棘手的。

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

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

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

或者它可以等到它的stdout被消耗。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM