2012-02-14 19 views
0

最初の質問:Java:ExecutorサービスはWindowsではなくLinux上で動作が遅くなります

私は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のバージョン:Windows 1.6.0_22、LinuxのオープンJDK1.6.0_20

EDIT:

私はLinux上で-Xincgcを追加しようと、予想通り、最初の数分間のコードが高速で実行され、その後、それが起動するように思えます急速に減速する。私が作成したコードチャンクが私のアプリケーションで膨大な時間稼働していることを確認してください。これは、JVM GCが異なるOSで異なる動作をしていることを示していますか?

AFTER試験:

OpenJDKのが問題を引き起こしているように見える4台の異なるLinuxマシンにしようとした後。最初はopenJDKをインストールしてはいけませんでしたが、@Alfabravoに感謝してくれてありがとうございます。

+1

コードを表示してください。 –

+1

WindowsシステムとLinuxシステムについて詳しく教えてください:両方が同じPCハードウェアにありますか?テスト結果でテストされたハードウェア仕様の一部はうまくいくでしょう... – ecle

+0

@eeeはい、両方とも同じハードウェアで動作します。私はすぐにいくつかのテスト結果を生成します。 – Vig

答えて

1

私が考えることのできる唯一のことは、2つのシステムではメモリの設定が多少異なり、Linuxの土地ではメモリが不足しているということです。ここでいくつか試してみてください:

  • 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

+0

ええ、あなたは警告を抑制することなくそれをすることはできません。 'List >'を作成することができます。 – Gray

+1

@Vigに役立つサンプルコードをいくつか掲載しました。 http://pastebin.com/3TkkxGYT – Gray

関連する問題