Сколько потоков может поддерживать виртуальная машина Java?
Сколько потоков может поддерживать виртуальная машина Java? Зависит ли это от поставщика? от операционной системы? другие факторы?
Переведено автоматически
Ответ 1
Это зависит от используемого вами процессора, от операционной системы, от того, что выполняют другие процессы, от того, какую версию Java вы используете, и других факторов. Я видел, что на сервере Windows было > 6500 потоков, прежде чем вывести машину из строя. Конечно, большинство потоков ничего не делали. Как только на компьютере было загружено около 6500 потоков (на Java), у всей машины начались проблемы, и она стала нестабильной.
Мой опыт показывает, что Java (последние версии) может без проблем использовать столько потоков, сколько может разместить сам компьютер.
Конечно, у вас должно быть достаточно оперативной памяти, и вы должны запустить Java с достаточным объемом памяти, чтобы делать все, что делают потоки, и иметь стек для каждого потока. Любая машина с современным процессором (последние пару поколений AMD или Intel) и с 1-2 гигабайтами памяти (в зависимости от ОС) может легко поддерживать JVM с тысячами потоков.
Если вам нужен более конкретный ответ, чем этот, лучше всего задать профиль.
Ответ 2
Хм, много.
Здесь есть несколько параметров. Конкретная виртуальная машина, плюс обычно на виртуальной машине также есть параметры времени выполнения. Это в некоторой степени зависит от операционной системы: какую поддержку потоков оказывает базовая ОС и какие ограничения она накладывает на них? Если виртуальная машина вообще использует потоки уровня операционной системы, то можно использовать старую добрую красную нить / зеленую нить.
Что означает "поддержка" - это другой вопрос. Если вы пишете программу на Java, которая представляет собой что-то вроде
(и не жалуйтесь на мелкие детали синтаксиса, я пью свою первую чашку кофе) тогда вам, безусловно, следует ожидать запуска сотен или тысяч потоков. Но создание потока обходится относительно дорого, а накладные расходы планировщика могут быть чрезмерными; неясно, сможете ли вы заставить эти потоки делать что-либо полезное.
Обновить
Ладно, не удержался. Вот моя маленькая тестовая программа с парой дополнений:
В OS / X 10.5.6 на Intel и Java 6 5 (см. Комментарии), вот что у меня получилось
Новый поток # 2547 Новый поток # 2548 Новый поток # 2549 Не удается создать поток: 5 Новый поток # 2550 Исключение в потоке "main" java.lang.OutOfMemoryError: не удается создать новый собственный поток на java.lang.Thread.start0 (собственный метод) на java.lang.Thread.start(Thread.java:592) в DieLikeADog.main(DieLikeADog.java:6)
Ответ 3
После прочтения поста Чарли Мартина мне стало любопытно, влияет ли размер кучи на количество потоков, которые вы можете создать, и я был совершенно ошарашен результатом.
Используя JDK 1.6.0_11 в Vista Home Premium SP1, я выполнил тестовое приложение Charlie с разными размерами кучи, от 2 МБ до 1024 МБ.
Например, чтобы создать кучу размером 2 МБ, я бы вызвал JVM с аргументами -Xms2m -Xmx2m.
Итак, да, размер кучи определенно имеет значение. Но взаимосвязь между размером кучи и максимальным количеством потоков ОБРАТНО пропорциональна.
Что странно.
Ответ 4
Я знаю, что этот вопрос довольно старый, но просто хочу поделиться своими выводами.
Мой ноутбук способен обрабатывать программу, которая порождает 25,000 потоки, и все эти потоки записывают некоторые данные в базу данных MySQL с регулярным интервалом в 2 секунды.
Я запускал эту программу с 10,000 threads for 30 minutes continuously, тогда также моя система была стабильной, и я мог выполнять другие обычные операции, такие как просмотр, открытие, закрытие других программ и т.д.
С 25,000 threads системой slows down, но она остается отзывчивой.
С 50,000 threads системой stopped responding все произошло мгновенно, и мне пришлось перезапустить мою систему вручную.
Ниже приведены сведения о моей системе :
Processor : Intel core 2 duo 2.13 GHz RAM : 4GB OS : Windows 7 Home Premium JDK Version : 1.6
Перед запуском я устанавливаю аргумент jvm -Xmx2048m.