Код выглядит следующим образом
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 спящих потоков, вызывает... что в операционной системе? Это переполнение памяти или связано с планировщиком задач ОС?
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)