Почему это небольшая программа Java сделать MacOS перезагрузка?

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 48 down

Код выглядит следующим образом

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)

4 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 7 down

Несмотря на то, что консоль показывает программа завершена, процесс JVM все еще работает, пока все ресурсы не будут освобождены. Между тем, ваша ОС из потоков, медленных и нестабильных, которые вызывают отстающие во всех процессах, в том числе завершения виртуальной машины Java. В целях самообороны, ОС вызывает панику ядра. И именно поэтому ваша MacOS перезагружается.

* OS - операционная система

up 2 down

Java был построен в 90-х годах, когда были только многоядерные процессоры.

Конечно, Java эволюционировала, как и современные процессоры. В настоящее время мы имеем 8-ядерные процессоры, с большими кэшами (например: 12Mb).

Несмотря на то, параллельная обработка эволюционировала много, Java все еще строятся вокруг модели процессора 1-ядра. Но, как ни с историей, позвольте мне объяснить очень и очень просто, что происходит.

Просто, просто создавая новый поток в Java, мы тратим много памяти.

Каждый поток потребляет около ~ 512KB - 1 МБ, в зависимости от вашей версии JVM (см сколько памяти нить берет на Яве а также Java Тема: Нераспределенная памяти). Имея это в виду, когда постоянно создавать новые темы, в какой-то момент они будут потреблять всю память кучи в.

Теперь, я никогда не пробовал это сам, но я предполагаю, что операционная система компьютера выключается/перезагружается из-за «из памяти» ошибки, в качестве контрмеры. (Это очень похоже на тройная ошибка, Что вызвало пресловутый «синий экран смерти» в Windows, где машина, необходимой для перезагрузки, чтобы сбросить состояние процессора)

Одно из возможных решений для этого, чтобы вручную установить максимальный размер кучи, которые будут использоваться в JVM. Таким образом, если ваша программа полностью использует предварительно выделена кучу, это не вызовет отключение. Пожалуйста, обратитесь к это SO вопрос о том, как это сделать.

up 1 down

Это Вилка бомба вариант. Это может привести к серьезному замедлению, но ни одна программа пользователя не должна быть в состоянии разбить ОСА. Это, вероятно, ошибка в ошибке операционной системы или памяти. Попробуйте запустить проверку памяти?

up -4 down

Скорее всего потому, что вы либо не дали вашей виртуальной машины Java достаточно памяти, или ваш компьютер комбинация аппаратного и MacOS не позволяют, что много нитей, чтобы быть активными одновременно. Эта проблема не ограничивается MacOS, но некоторые дистрибутивы Linux, например Bodhi Linux, есть это ограничение тоже. Не обманывайтесь «OutOfMemoryError» - это часто может означать, что JVM не смог выделить нативную нить.

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском