Сколько стеков потоков может существовать в Java-приложении?

«Сколько стеков потоков может существовать в Java-приложении?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Каждый поток (Thread) в Java имеет свой собственный стек. Следовательно, количество стеков равно количеству активных потоков в приложении.

Источники потоков (и стеков):

  1. Главный поток (main).
  2. Потоки, явно созданные через new Thread() или пулы (ExecutorService).
  3. Системные потоки (например, GC, Finalizer).

Пример:

public class StackCountExample {
    public static void main(String[] args) {
        // Главный поток (1 стек)
        Runnable task = () -> System.out.println(Thread.currentThread().getName());
        Thread t1 = new Thread(task); // Поток t1 (2-й стек)
        Thread t2 = new Thread(task); // Поток t2 (3-й стек)
        t1.start();
        t2.start();
        // Всего 3 стека
    }
}

Ограничения: Максимальное количество потоков (и стеков) ограничено:

  • Размером стека на поток: Задаётся параметром JVM -Xss (например, -Xss1m).
  • Доступной оперативной памятью.
  • Ограничениями ОС (например, ulimit -u в Linux). При превышении лимита возникает ошибка OutOfMemoryError: unable to create new native thread.