簡體   English   中英

Java:Executor Service在Linux而非Windows上運行緩慢

[英]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領域中的內存不足。 這里有一些嘗試的方法:

  • 在Linux(duh)下增加內存設置。 -Xmx1G
  • 收獲后,將每個future分配為null 這可能影響不大,但可能值得幫助GC解決問題。

     for(int i = 0; i < n; i++) { future[i].get(); future[i] = null; } 
  • 不要將Perform對象存儲在數組中。 只需提交它們,而不必理會它們。 如果仍然需要它們,則在Future<Perform>中將它們返回,然后在完成它們時將它們設置為null。
  • 最好的選擇可能是不要一次提交所有工作,而是保留100個優秀職位。 Future數組轉換為列表,並獲取一次isDone()isCancelled()並且僅在列表的大小低於某個閾值時才提交給池。 您需要睡眠以免旋轉。 我實際上是最近做的,所以這里有一些示例代碼: http : //pastebin.com/3TkkxGYT

要考慮的另一件事是,如果您的Perform任務很小,那么您可能比其他任何事情都在測試OS的上下文切換。 但是我認為它不會隨着時間的流逝而放慢速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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