簡體   English   中英

如果父啟動它后沒有銷毀它,Java process.start會非常慢

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM