McGoverntheory задал этот вопрос в Stackoverflow:
Сколько потоков поддерживает Java Virtual Machine больше всего? Это связано с разработчиками виртуальных машин? А как насчет операционной системы? Есть ли другие факторы?
Ответ Эдди:
Это зависит от процессора, который вы используете, операционную систему, что делают другие процессы, версию Java, которую вы используете, и другие факторы. Я видел сервер Windows с более чем 6500 потоками, прежде чем он упадет. Конечно, большинство тем ничего не делают. Как только на машине будет почти 6500 потоков (в Java), машина начнет возникать проблемы и станет нестабильной.
По моему опыту, потоки, содержащиеся в JVM, положительно коррелируют с производительностью самого компьютера.
Конечно, вам нужно иметь достаточно нативной памяти и выделить достаточно памяти на Java, чтобы каждый поток мог иметь стек (стек виртуальных машин) и мог делать все, что вы хотите. Любая машина с современным ЦП (последние поколения AMD или Intel) и память 1-2G (в зависимости от операционной системы) может легко поддерживать виртуальную машину Java с тысячами потоков.
Если вам нужен более точный ответ, лучше всего провести стресс -тест.
Ответ Чарли Мартина:
Есть много параметров (может быть установлено). Для конкретных виртуальных машин у них будут свои собственные параметры времени выполнения. (Максимальное количество потоков) В определенной степени он определяется операционной системой: какая поддержка должна предоставить базовая операционная система для потоков? Какие ограничения налагаются? Использует ли виртуальная машина поток нативной операционной системы, красной резьбы или зеленого потока?
Поддержка, предоставленная операционной системой, является еще одной проблемой. Если вы напишите программу Java, как это:
Кода -копия выглядит следующим образом:
класс dielikeadog {
public static void main (string [] argv) {
для(;;){
новая ветка (новая somerunable) .start ();
}
}
}
(Не жалуйтесь на сведения о синтаксисе, это только начинается), то, конечно, вы хотите получить сотни беговых потоков. Тем не менее, стоимость создания потока относительно высока, а накладные расходы (слишком много потоков) становятся заметными. По -прежнему неясно, могут ли эти потоки делать полезные вещи.
Обновленная версия
Хорошо, не могу ждать! Вот небольшая программа испытаний, которая была слегка отполирована:
Скопируйте код следующим образом: открытый класс Dielikeadog {
частный статический объект s = new Object ();
Частный статический count = 0;
public static void main (string [] argv) {
для(;;){
Новый поток (new Runnable () {
public void run () {
синхронизированный (ы) {
count += 1;
System.err.println ("Новый поток #"+count);
}
для(;;){
пытаться {
Thread.sleep (1000);
} catch (Exception e) {
System.err.println (e);
}
}
}
}).начинать();
}
}
}
В системе Intel OS/X 10.5.6 вывод Java 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)
Ответ Бенджизтит:
Прочитав ответ Чарли Мартина, мне было интересно, может ли размер памяти кучи изменить количество созданных потоков, а затем я был ошеломлен результатом: в системе Vista Home Premium SP1, используя JDK 1.6.0_11, Установите размер памяти кучи с 2 м до 1024 м, чтобы выполнить тестовую программу Чарли. Например: для создания памяти на 2 м, параметры виртуальной машины, которые я использую: -xms2m -xmx2m.
Вот мои результаты теста:
Скопируйте код следующим образом: 2 МБ -> 5744 потоки
4 МБ -> 5743 потока
8 МБ -> 5735 потоков
12 МБ -> 5724 потоков
16 МБ -> 5712 потоков
24 МБ -> 5687 потоков
32 МБ -> 5662 потока
48 МБ -> 5610 потоков
64 МБ -> 5561 потока
96 МБ -> 5457 потоков
128 МБ -> 5357 потоков
192 МБ -> 5190 потоков
256 МБ -> 5014 потоков
384 МБ -> 4606 потоков
512 МБ -> 4202 потока
768 МБ -> 3388 потоков
1024 МБ -> 2583 потока
Таким образом, размер кучи действительно важен. Однако размер кучи и максимальное количество потоков обратно пропорциональны.
Это так странно!
Ответ Нила Коффи:
Абсолютное теоретическое максимальное количество потоков - это адресное пространство пользователя процесса, разделенное по размеру стека потоков (в действительности, если вся память используется стеком потоков, программа не будет работать). Следовательно, в качестве примера, принимая 32-разрядную систему Windows, адресное пространство каждого процесса составляет 2 г. Полем На самом деле в системе XP я обнаружил, что около 13 000 потоков можно запустить.
Тогда я думаю, что ваш вопрос по существу: (а) может ли вы эффективно управлять многими потоками в своем коде и не позволять им делать это, очевидно, глупо (например: пусть они на одном и том же объекте (б) может ли операционная система эффективно управлять этими многочисленными потоками. В основном, если (а) ответ «да», ответ (б) ответ «да».
По совпадению, вы можете установить размер стека потока в конструкторе потока, но вам не нужно и не должно путать это с параметрами виртуальной машины.