Сколько потоков может генерировать приложение до завершения JVM
Q:
1) В многопоточном приложении существует ограничение на количество потоков, которые может появиться в приложении.
2) Если такой предел существует, то JVM завершает приложение и с каким кодом ошибки.
ИЗМЕНИТЬ
3) Если приложение возникло очень быстро, может ли JVM обнаружить это как "грубое" приложение
Заранее спасибо
Ответы
Ответ 1
Никакой предел, указанный спецификацией JVM. ОС может (возможно) ограничить ее, как обычно, на процесс и т.д.
Каждый поток также выделяет стек и т.д., Поэтому может потребоваться много памяти, поэтому в зависимости от компьютера, какой предел будет достигнут первым.
Обратите внимание: слишком много потоков, как правило, неэффективны. Ваша программа может/должна, вероятно, лучше масштабироваться по-другому. Использование пулов потоков (служба-исполнитель), асинхронный ввод-вывод, fork/join и т.д. В зависимости от ваших потребностей.
См. также:
Есть ли какой-либо жесткий предел для ряда потоков в Java?
Сколько потоков может поддерживать Java VM?
Ответ 2
1). Нет, нет предела. По крайней мере, не так. Конечно, у вас не хватит памяти.
2). OutOfMemoryException.
3). Вы имеете в виду вилочную бомбу? Нет.
Ответ 3
Вы должны проверить его для своей установки. Я сделал для себя:
import static java.lang.Thread.currentThread;
import java.util.concurrent.CountDownLatch;
public class Test {
static final Thread t = currentThread();
public static void main(String[] args) throws Exception {
int i = 0;
try {
while (true) {
final CountDownLatch l = new CountDownLatch(1);
new Thread() { public void run() { l.countDown(); park(); }}.start();
l.await();
i++;
}
} finally { System.out.println("Started " + i + " threads."); }
}
private static void park() {
try { t.join(); } catch (InterruptedException e) {
System.out.println("Unparked");
}
}
}
Вывод:
Started 2030 threads.
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:658)
at test.Test.main(Test.java:10)
Ответ 4
Сколько потоков может генерировать приложение до его прекращения по JVM
Вопрос основан на ложной посылке. Когда у JVM заканчивается возможность создавать новые потоки, он просто выдает исключения из кода, который пытался создать дополнительный поток. Приложение не "прерывается JVM".
Ответ 5
Понимает, как много вы делаете с каждым отдельным потоком, который я чувствую. Вы можете предоставить ресурсы для JVM с переменными окружения, поэтому я думаю, что есть хорошая сумма. И код ошибки, скорее всего, будет OutOfMemoryException, проблемы с кучей пространства.
Это также сводится к тому, что вы делаете ручные потоки или используете пул потоков. Каждый раз, когда вы делаете ручную нить, требуется ядро. В Threadpool нет.