← Назад к вопросам
Сколько тратится ресурсов для запуска нового 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 MB (регулируется Xss)
- Не создавай потоки на лету — используй ThreadPool
- Оптимум: CPU ядра * 2 для I/O задач
- Virtual Threads (Java 21+): 10-50 KB, очень быстро
- Контролируй количество потоков в production