首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果parent在启动后没有被销毁,那么Java process.start会变得非常慢。

如果parent在启动后没有被销毁,那么Java process.start会变得非常慢。
EN

Stack Overflow用户
提问于 2011-12-07 22:37:06
回答 2查看 242关注 0票数 3

如果我直接从命令行启动一个特定的进程,我会看到它在2-3秒内完全启动。

如果我从Java程序使用完全相同的命令启动完全相同的进程,它会在启动时挂起,除非父进程被销毁。为什么?

使用ProcessBuilder:

代码语言:javascript
复制
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.directory(new File(dir));
Process p = pb.start();

使用Runtime.exec:

代码语言:javascript
复制
Runtime.getRuntime().exec(cmd, null, new File(dir));

无论哪种方式,如果我没有将新的进程对象设置为null并立即调用垃圾收集器,新进程将花费3分钟来完成它应该在3秒内完成的相同工作。

代码语言:javascript
复制
Process p = pb.start();
p = null;
Runtime.getRuntime().gc();

使用上面的代码解决了这个问题。有人能给我解释一下原因吗?我认为这与JVM和进程处理有关,但这只是一个猜测。

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

谢谢,

祝您今天愉快

EN

回答 2

Stack Overflow用户

发布于 2011-12-07 23:16:34

从Java应用程序运行外部程序是出了名的难以正确执行。

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

如果您希望避免在代码中添加依赖项,至少要看看Exec library's Java code,看看它是如何创建和运行进程的。

票数 1
EN

Stack Overflow用户

发布于 2011-12-07 23:18:00

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

或者,它可以等到它的stdout被使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8417062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档