Вопрос-ответ

How many threads can a Java VM support?

Сколько потоков может поддерживать виртуальная машина Java?

Сколько потоков может поддерживать виртуальная машина Java? Зависит ли это от поставщика? от операционной системы? другие факторы?

Переведено автоматически
Ответ 1

Это зависит от используемого вами процессора, от операционной системы, от того, что выполняют другие процессы, от того, какую версию Java вы используете, и других факторов. Я видел, что на сервере Windows было > 6500 потоков, прежде чем вывести машину из строя. Конечно, большинство потоков ничего не делали. Как только на компьютере было загружено около 6500 потоков (на Java), у всей машины начались проблемы, и она стала нестабильной.

Мой опыт показывает, что Java (последние версии) может без проблем использовать столько потоков, сколько может разместить сам компьютер.

Конечно, у вас должно быть достаточно оперативной памяти, и вы должны запустить Java с достаточным объемом памяти, чтобы делать все, что делают потоки, и иметь стек для каждого потока. Любая машина с современным процессором (последние пару поколений AMD или Intel) и с 1-2 гигабайтами памяти (в зависимости от ОС) может легко поддерживать JVM с тысячами потоков.

Если вам нужен более конкретный ответ, чем этот, лучше всего задать профиль.

Ответ 2

Хм, много.

Здесь есть несколько параметров. Конкретная виртуальная машина, плюс обычно на виртуальной машине также есть параметры времени выполнения. Это в некоторой степени зависит от операционной системы: какую поддержку потоков оказывает базовая ОС и какие ограничения она накладывает на них? Если виртуальная машина вообще использует потоки уровня операционной системы, то можно использовать старую добрую красную нить / зеленую нить.

Что означает "поддержка" - это другой вопрос. Если вы пишете программу на Java, которая представляет собой что-то вроде

   class DieLikeADog {
public static void main(String[] argv){
for(;;){
new Thread(new SomeRunaable).start();
}
}
}

(и не жалуйтесь на мелкие детали синтаксиса, я пью свою первую чашку кофе) тогда вам, безусловно, следует ожидать запуска сотен или тысяч потоков. Но создание потока обходится относительно дорого, а накладные расходы планировщика могут быть чрезмерными; неясно, сможете ли вы заставить эти потоки делать что-либо полезное.

Обновить

Ладно, не удержался. Вот моя маленькая тестовая программа с парой дополнений:

public class DieLikeADog {
private static Object s = new Object();
private static int count = 0;
public static void main(String[] argv){
for(;;){
new Thread(new Runnable(){
public void run(){
synchronized(s){
count += 1;
System.err.println("New thread #"+count);
}
for(;;){
try {
Thread.sleep(1000);
} catch (Exception e){
System.err.println(e);
}
}
}
}).start();
}
}
}

В 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.

Вот мои результаты:

2 mb --> 5744 threads
4 mb --> 5743 threads
8 mb --> 5735 threads
12 mb --> 5724 threads
16 mb --> 5712 threads
24 mb --> 5687 threads
32 mb --> 5662 threads
48 mb --> 5610 threads
64 mb --> 5561 threads
96 mb --> 5457 threads
128 mb --> 5357 threads
192 mb --> 5190 threads
256 mb --> 5014 threads
384 mb --> 4606 threads
512 mb --> 4202 threads
768 mb --> 3388 threads
1024 mb --> 2583 threads

Итак, да, размер кучи определенно имеет значение. Но взаимосвязь между размером кучи и максимальным количеством потоков ОБРАТНО пропорциональна.

Что странно.

Ответ 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.

Надеюсь, это поможет.

java multithreading