2012-02-14 36 views
0

最初的問題:的Java:執行人服務運行速度慢在Linux上,而不是在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(); 

這兩個OS都運行在同一臺機器上。 JAVA版本:窗戶1.6.0_22,Linux開放源JDK1.6.0_20

編輯:

我試圖在Linux上增加-Xincgc,似乎像最初幾分鐘的代碼運行速度快如預期啓動後加快並迅速減速。請參閱我創建的代碼塊在我的應用程序中運行數十億次,這是否表明JVM GC在不同的操作系統中的行爲不同?

在試驗之後:

4臺不同的Linux機器,它看起來像在OpenJDK是造成問題的努力之後。我不應該首先安裝openJDK,但要感謝@Alfabravo指出。

+1

顯示一些代碼。 – 2012-02-14 16:19:21

+1

詳細瞭解Windows系統和Linux系統:都在同一臺PC硬件上?一些已經通過測試結果測試的硬件規格將會很好... – ecle 2012-02-14 16:27:03

+0

@eee是的,它們都在相同的硬件上運行。我會很快產生一些測試結果。 – Vig 2012-02-14 16:29:38

回答

1

關於我能想到的唯一情況是,在內存設置在兩個系統上有所不同,並且您在Linux-land的早期內存不足。這裏有些事情要嘗試:

  • 增加Linux(duh)下的內存設置。 -Xmx1G或東西
  • 收穫後,將每個未來分配到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的上下文切換比什麼都重要。但我不認爲它會隨着時間的推移自行減速。

+0

感謝您的見解 如何爲未來創建陣列,它不會讓我創建一個陣列。 – Vig 2012-02-14 18:31:44

+0

是的,你不能不壓制警告。你可以創建一個'List >'。 – Gray 2012-02-14 18:38:29

+1

我剛剛發佈了一些示例代碼,可能有助於@Vig。 http://pastebin.com/3TkkxGYT – Gray 2012-02-14 18:58:58

相關問題