コードは以下の通り
Set<Thread> threads = new HashSet<>();
Runnable r = () -> {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
for (int i = 0; i < 20000; i++) {
Thread t = new Thread(r);
threads.add(t);
t.start();
if (i % 100 == 0) {
System.out.println(i);
}
Thread.sleep(2);
}
実行すると、次のような値が表示され始めます
0
100
200
300
予想通り、そして私が見るまで続きます:
3900
4000
Exception in thread "main" Java.lang.OutOfMemoryError: unable to create new native thread
at Java.lang.Thread.start0(Native Method)
at Java.lang.Thread.start(Thread.Java:717)
at App.main(scratch.Java:24)
Java HotSpot(TM) 64-Bit Server VM warning: Exception Java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated
しかし、しばらくして(10〜20秒程度)MacOSは再起動することにしました。ここに表示される再起動の原因は何ですか?例外をスローするメインスレッドですが、約4000スレッドがスリープしていると、オペレーティングシステムで何が発生しますか?これはメモリオーバーフローですか、それともOSのタスクスケジューラに関連していますか?
MacOS version: 10.14.3 (18D109)
Java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
これは フォーク爆弾 の変形です。これは深刻なスローダウンを引き起こす可能性がありますが、ユーザープログラムがOSをクラッシュさせることはできません。これはおそらくOSのバグかメモリエラーです。メモリチェックを実行してみますか?