0

私は文脈の切り替えを避けようとしています。待ち時間が長くなるからです。だから私が正しく思っているなら、プロセッサあたり最大で1つのスレッドが必要です。プロセッサが仮想並列処理(ハイパースレッディングというのは名前だと思う!)をサポートしていれば、二重のスレッド数を持つことができます。開始時にJVM forkを実行するスレッドの数はいくつですか?

例:ハイパースレッディング= 8スレッド以下のプロセッサ4個。

もちろん、OSにもプロセッサが必要なので、私はここでは素朴です。

とにかく、JVMが起動時に作成するスレッドの数を知っておくと良いスタートです。

+0

はい、あなたは少しナイーブです。 GCはいくつのレイテンシを持ちますが、いくつかのGCアルゴリズムではマルチプロセッサシステムでそれを減らすことができます。低レイテンシを保証したい場合は、Javaを避けてください。 (そして、好ましくはすべての非リアルタイムOS。) – biziclop

+2

トピックから少し離れた、したがってコメントです。 「そうだとすれば、正しく考えていれば、プロセッサあたり最大1つのスレッドが必要です」 スレッドは100%常に動作しロックを取らない限り、実際には思ったほど良い考えではありません。 Oか何か他のもの。もちろん、それをやり直すべきではありませんが、ほとんどの場合、スレッド数をコアまたはHWスレッドの数と同じくらい低く抑えようとすると、CPUを最大限に活用できません。 – Fredrik

+0

"私は文脈の切り替えを避けようとしています。それは?あなたは測定しましたか? – EJP

答えて

4

JVMは、「メイン」スレッドとも呼ばれる1つのユーザースレッドのみを開始します。このようガベージコレクタ、コンパイラ、オプティマイザ、ファイナライザなどとして舞台裏で実行されている他のスレッドが何もない小さなアプリケーションのスレッドダンプをざっと見てみると

..あります

public static void main(String[] args) throws Exception { 
    Thread.sleep(100000); 
} 

を示しています。

"Low Memory Detector" daemon prio=5 tid=7f810c801000] 
"C2 CompilerThread1" daemon prio=9 tid=7f810c800000 
"C2 CompilerThread0" daemon prio=9 tid=7f8107037000 
"Signal Dispatcher" daemon prio=9 tid=7f8107036000 
"Surrogate Locker Thread (Concurrent GC)" daemon prio=5 tid=7f8107801000 
"Finalizer" daemon prio=8 tid=7f810882a000 nid=0x1118cb000 
"Reference Handler" daemon prio=10 tid=7f8108829000 nid=0x1117c8000 
"main" prio=5 tid=7f8104801000 nid=0x109a52000 waiting on condition 
"VM Thread" prio=9 tid=7f8108824800 nid=0x1116c5000 runnable 
"Gang worker#0 (Parallel GC Threads)" prio=9 tid=7f8104802800 
"Gang worker#1 (Parallel GC Threads)" prio=9 tid=7f8104803000 
"Gang worker#2 (Parallel GC Threads)" prio=9 tid=7f8104803800 
"Gang worker#3 (Parallel GC Threads)" prio=9 tid=7f8107800000 
"Gang worker#4 (Parallel GC Threads)" prio=9 tid=7f8108800000 
"Gang worker#5 (Parallel GC Threads)" prio=9 tid=7f8107000800 
"Gang worker#6 (Parallel GC Threads)" prio=9 tid=7f8107001000 
"Gang worker#7 (Parallel GC Threads)" prio=9 tid=7f8107002000 
"Concurrent Mark-Sweep GC Thread" prio=9 tid=7f810701c000 
"Gang worker#0 (Parallel CMS Threads)" prio=9 tid=7f81090c3000 
"Gang worker#1 (Parallel CMS Threads)" prio=9 tid=7f810701b800 
"VM Periodic Task Thread" prio=10 tid=7f810c812800 
"Exception Catcher Thread" prio=10 tid=7f8104801800 
+0

1つのプロセッサを各スレッドに提供することによってコンテキストの切り替えを避けたい場合、JVMがこの単一のユーザスレッドの他に作成するスレッドの総数を知る価値はありますか? – JohnPristine

+0

私はそう思わない@JohnPristine。あなたがアプリケーションを "最大化"するために実行すべきユーザスレッドの数を聞いているなら、私はガベージコレクタに1を割り当てます。残りのどれも、かなりの時間を費やす必要はありません。 – Gray

+0

もちろん、あなたの 'finalize()'メソッド(無限ループなど)に何を置くかによって、ファイナライザスレッドはコア全体を占めることもあります。 – biziclop

関連する問題