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