如果我直接从命令行启动一个特定的进程,它会在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服务器。
谢谢您,祝您有愉快的一天。