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
はい、あなたは少しナイーブです。 GCはいくつのレイテンシを持ちますが、いくつかのGCアルゴリズムではマルチプロセッサシステムでそれを減らすことができます。低レイテンシを保証したい場合は、Javaを避けてください。 (そして、好ましくはすべての非リアルタイムOS。) – biziclop
トピックから少し離れた、したがってコメントです。 「そうだとすれば、正しく考えていれば、プロセッサあたり最大1つのスレッドが必要です」 スレッドは100%常に動作しロックを取らない限り、実際には思ったほど良い考えではありません。 Oか何か他のもの。もちろん、それをやり直すべきではありませんが、ほとんどの場合、スレッド数をコアまたはHWスレッドの数と同じくらい低く抑えようとすると、CPUを最大限に活用できません。 – Fredrik
"私は文脈の切り替えを避けようとしています。それは?あなたは測定しましたか? – EJP