web-dev-qa-db-ja.com

なぜこの小さなJavaプログラムはMacOSを再起動させるのですか?

コードは以下の通り

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)
48
Koray Tugay

これは フォーク爆弾 の変形です。これは深刻なスローダウンを引き起こす可能性がありますが、ユーザープログラムがOSをクラッシュさせることはできません。これはおそらくOSのバグかメモリエラーです。メモリチェックを実行してみますか?

0
ErikWi