[英]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.