Сколько потоков может генерировать приложение до завершения 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 нет.