[英]Java: Executor Service runs slow on linux and not on Windows
初始問題:
我有一個使用ExecutorService來運行4 fixedThreadPool的應用程序。 當我使用這種體系結構時,該應用程序在Windows以及單線程體系結構上運行得更快。 但是,當我在Linux上運行ExecutorService體系結構時,我的應用程序的性能卻比單線程應用程序差。
兩台計算機上的CPU和其他硬件相同。 我什至在不同的機器上嘗試過,都得到了相同的結果。 我什至試圖將fixedThreadPool限制為3或2,但性能仍然較慢。 我缺少的導致Linux機器運行緩慢的變量是什么?
ExecutorService execSvc =
Executors.newFixedThreadPool(NUMBER_OF_PROCESSORS);
Perform perform[] = new Perform[n];
Future<?>[] future = new Future<?>[n];
for(int i=0;i<n;i++)
future = execSvc.submit(perform[i]);
for(int i=0;i<n;i++)
//To wait until all done
future[i].get();
兩個操作系統都在同一台計算機上運行。 JAVA版本:Windows 1.6.0_22,Linux Open JDK1.6.0_20
編輯:
我嘗試在Linux上添加-Xincgc,似乎在開始的幾分鍾,代碼按預期運行,然后開始快速運行。 請注意,我創建的代碼塊在我的應用程序中運行了無數次,這是否表明JVM GC在不同的操作系統中的行為不同?
試用后:
在嘗試使用4種不同的linux計算機后,似乎openJDK引起了問題。 我不應該首先安裝openJDK,但要感謝@Alfabravo指出了這一點。
我唯一能想到的是,這兩個系統上的內存設置有所不同,並且您在Linux領域中的內存不足。 這里有一些嘗試的方法:
-Xmx1G
收獲后,將每個future分配為null
。 這可能影響不大,但可能值得幫助GC解決問題。
for(int i = 0; i < n; i++) { future[i].get(); future[i] = null; }
Perform
對象存儲在數組中。 只需提交它們,而不必理會它們。 如果仍然需要它們,則在Future<Perform>
中將它們返回,然后在完成它們時將它們設置為null。 Future
數組轉換為列表,並獲取一次isDone()
或isCancelled()
並且僅在列表的大小低於某個閾值時才提交給池。 您需要睡眠以免旋轉。 我實際上是最近做的,所以這里有一些示例代碼: http : //pastebin.com/3TkkxGYT 要考慮的另一件事是,如果您的Perform
任務很小,那么您可能比其他任何事情都在測試OS的上下文切換。 但是我認為它不會隨着時間的流逝而放慢速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.