web-dev-qa-db-fra.com

Pourquoi ce petit programme Java fait redémarrer MacOS?

Le code est le suivant

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);
}

Une fois exécuté, je commence à voir des valeurs comme

0
100
200
300

comme prévu, et ça va jusqu'à ce que je vois:

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

Mais après un court instant (10 à 20 secondes environ), MacOS décide de redémarrer. Quelle est la cause du redémarrage que je vois ici? Le thread principal lançant une exception, mais le processus ayant environ 4000 threads en sommeil provoque ... quoi dans le système d'exploitation? Est-ce un débordement de mémoire ou lié au planificateur de tâches du système d'exploitation?

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

Ceci est une variante Fork bomb . Cela peut provoquer un ralentissement sévère, mais aucun programme utilisateur ne devrait pouvoir planter le système d'exploitation. Il s'agit probablement d'un bogue dans le système d'exploitation ou d'une erreur de mémoire. Essayez d'exécuter une vérification de la mémoire?

0
ErikWi