← Назад к вопросам

Сколько тратится ресурсов для запуска нового Thread?

1.0 Junior🔥 181 комментариев
#ORM и Hibernate#Spring Boot и Spring Data#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ресурсы для создания нового Thread в Java

Память на один Thread

JVM Stack:

  • Размер по умолчанию: 1 MB
  • На 1000 потоков: 1000 MB (1 GB)

Heap Memory (объект Thread):

  • Thread объект: 500 bytes
  • Native структуры: 1-2 KB

ИТОГО: около 1 MB на один поток

Практический пример

Задача: обработка 10 000 одновременных HTTP запросов.

Плохо: 10 000 потоков

  • Память: 10 000 * 1 MB = 10 GB
  • Context switching: >50% CPU overhead
  • Производительность: ужасная

Хорошо: 8 потоков (оптимум)

  • Память: 8 * 1 MB = 8 MB
  • Context switching: 2% overhead
  • Производительность: отличная

CPU время для создания Thread

  • JVM операции: 1-10 ms
  • OS system calls: 5-20 ms
  • ВСЕГО: 10-50 ms на один поток

Это почему используют ThreadPool — потоки переиспользуются.

Без ThreadPool (плохо)

Каждый запрос создаёт новый поток:

  • 20 ms на создание + 100 ms на работу = 120 ms
  • 1000 запросов: минимум 20 секунд только на создание!

С ThreadPool (хорошо)

Переменные 8 потоков переиспользуются:

  • 0 ms на создание + 100 ms на работу = 100 ms
  • Потоки ждут в очереди, очень эффективно

Virtual Threads (Java 21+)

  • Память: 10-50 KB на поток (вместо 1 MB!)
  • Создание: <1 ms (вместо 50 ms)
  • Можем создавать 1 000 000+ потоков

Контекстное переключение

  • Время одного switch: 1-10 микросекунд
  • На 1000 потоков в 4-ядерной машине: ~20% CPU на переключение
  • Это почему нужен оптимальный ThreadPool

Главный вывод

  1. Память на поток: 1 MB (регулируется Xss)
  2. Не создавай потоки на лету — используй ThreadPool
  3. Оптимум: CPU ядра * 2 для I/O задач
  4. Virtual Threads (Java 21+): 10-50 KB, очень быстро
  5. Контролируй количество потоков в production