McGoverntheoryはStackoverFlowでこの質問をしました:
Java仮想マシンはせいぜいいくつのスレッドをサポートしていますか?仮想マシン開発者に関連していますか?オペレーティングシステムはどうですか?他の要因はありますか?
エディの答え:
使用しているCPU、オペレーティングシステム、他のプロセスが行っていること、使用しているJavaのバージョン、およびその他の要因に依存します。ダウンする前に6500以上のスレッドを備えたWindowsサーバーを見てきました。もちろん、ほとんどのスレッドは何もしません。マシンに約6500個のスレッド(Java)があると、マシンに問題が発生し始め、不安定になります。
私の経験では、JVMに含まれるスレッドは、コンピューター自体のパフォーマンスと正の相関があります。
もちろん、各スレッドがスタック(仮想マシンスタック)を持ち、必要なことを何でもできるように、十分なネイティブメモリを持ち、Javaに十分なメモリを割り当てる必要があります。最新のCPU(AMDまたはIntelの最近の世代)と1-2Gメモリ(オペレーティングシステムに応じて)を備えたマシンは、数千のスレッドを備えたJava仮想マシンを簡単にサポートできます。
より正確な答えが必要な場合は、ストレステストを自分で行うことをお勧めします。
チャーリー・マーティンの答え:
多くのパラメーターがあります(設定できます)。特定の仮想マシンの場合、独自のランタイムパラメーターがあります。 (スレッドの最大数)ある程度、オペレーティングシステムによって決定されます。基礎となるオペレーティングシステムは、スレッドにどのようなサポートを提供すべきですか?どのような制限が課されますか?仮想マシンは、ネイティブオペレーティングシステムのスレッド、または赤い糸または緑の糸を使用していますか?
オペレーティングシステムが提供するサポートは別の問題です。このようなJavaプログラムを書く場合:
コードコピーは次のとおりです。
クラスdielikeadog {
public static void main(string [] argv){
のために(;;){
新しいスレッド(new somerunaable).start();
}
}
}
(構文の詳細について文句を言う必要はありません。これはちょうど始まったばかりです)そしてもちろん、何百もの実行されたスレッドを取得したいと思います。ただし、スレッドを作成するコストは比較的高く、(スレッドが多すぎる)スケジューリングのオーバーヘッドが顕著になります。これらのスレッドが有用なことを行うことができるかどうかはまだ不明です。
アップグレードバージョン
わかりました、待ちきれません!これは、わずかに洗練された小さなテストプログラムです。
次のようにコードをコピーします:パブリッククラスdielikeadog {
private staticオブジェクトs = new object();
private static int count = 0;
public static void main(string [] argv){
のために(;;){
新しいスレッド(new runnable(){
public void run(){
同期(s){
count += 1;
system.err.println( "newスレッド#"+count);
}
のために(;;){
試す {
thread.sleep(1000);
} catch(例外e){
System.err.println(e);
}
}
}
})。始める();
}
}
}
IntelのOS/X 10.5.6システムでは、Java 5の出力は次のとおりです。
コードコピーは次のとおりです。
新しいスレッド#2547
新しいスレッド#2548
新しいスレッド#2549
スレッドを作成できません:5
新しいスレッド#2550
スレッド「Main」Java.lang.outofMemoryErrorの例外:新しいネイティブスレッドを作成できません
java.lang.thread.start0(ネイティブメソッド)
java.lang.thread.start(thread.java:592)
dielikeadog.main(dielikeadog.java:6)
ベンジズムの答え:
チャーリー・マーティンの返信を読んだ後、ヒープメモリのサイズが作成されたスレッドの数に違いを生むことができるかどうか疑問に思っていました。その後、結果にびっくりしました。ヒープメモリのサイズを2mから1024mに設定して、チャーリーのテストプログラムを実行します。たとえば、2Mヒープメモリを作成するには、使用する仮想マシンパラメーターは-xms2m -xmx2mです。
これが私のテスト結果です:
次のようにコードをコピーします:2 MB-> 5744スレッド
4 MB-> 5743スレッド
8 MB-> 5735スレッド
12 MB-> 5724スレッド
16 MB-> 5712スレッド
24 MB-> 5687スレッド
32 MB-> 5662スレッド
48 MB-> 5610スレッド
64 MB-> 5561スレッド
96 MB-> 5457スレッド
128 MB-> 5357スレッド
192 MB-> 5190スレッド
256 MB-> 5014スレッド
384 MB-> 4606スレッド
512 MB-> 4202スレッド
768 MB-> 3388スレッド
1024 MB-> 2583スレッド
したがって、ヒープのサイズは本当に重要です。ただし、ヒープサイズとスレッドの最大数は逆に比例します。
これはとても奇妙です!
ニール・コフィーの答え:
スレッドの絶対理論的最大数は、プロセスのユーザーアドレス空間をスレッドスタックのサイズで割ったことです(実際には、すべてのメモリがスレッドスタックで使用される場合、実行できるプログラムはありません)。したがって、32ビットのWindowsシステムを例にとると、各プロセスのアドレススペースは2gです。 。実際、XPシステムでは、約13,000個のスレッドを開始できることがわかりました。
次に、あなたの質問は本質的に:(a)コード内の多くのスレッドを効果的に管理できるかどうかは明らかに愚かです(次のようなものです。これらの多くのスレッドを効果的に管理します。基本的に、(a)の答えが「はい」の場合、答え(b)の答えは「はい」です。
偶然にも、スレッドコンストラクターにスレッドスタックサイズを設定できますが、仮想マシンパラメーターと混同する必要はなく、混同しないでください。