【问题标题】:Java process.start slows down extremely if parent is not destroyed after launching it如果父进程在启动后没有被销毁,Java process.start 会非常慢
【发布时间】:2011-12-07 14:37:06
【问题描述】:

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

谢谢,

祝你有美好的一天

【问题讨论】:

    标签: java process exec freeze processbuilder


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,但我不是在寻找替代方案,我只是好奇为什么会这样。
    【解决方案2】:

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

    提供输入

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

    【讨论】:

    • 不,我将程序作为“java -jar .jar file.properties”启动。从未请求任何输入
    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多