13 ответов:
Это зависит от используемого процессора, от ОС, от того, что делают другие процессы, от того, какой выпуск Java вы используете, и других факторов. Я видел, что Windows server имеет > 6500 потоков, прежде чем вывести машину. Большинство нитей, конечно, ничего не делали. Как только машина достигла около 6500 потоков (в Java), вся машина начала иметь проблемы и стала нестабильной.
мой опыт показывает, что Java (последние версии) может с радостью потреблять столько же Потоки, как сам компьютер может разместить без проблем.
конечно, у вас должно быть достаточно оперативной памяти, и вы должны запустить Java с достаточным объемом памяти, чтобы делать все, что делают потоки, и иметь стек для каждого потока. Любая машина с современным процессором (последние пару поколений AMD или Intel) и с 1-2 гигабайтами памяти (в зависимости от ОС) может легко поддерживать JVM с тысячи потоков.
Если вам нужен более конкретный ответ чем это, ваш лучший выбор-профиль.
Хм, много.
здесь есть несколько параметров. Конкретная виртуальная машина, а также обычно есть параметры времени выполнения на виртуальной машине. Это несколько зависит от операционной системы: какую поддержку имеет базовая ОС для потоков и какие ограничения она накладывает на них? Если виртуальная машина действительно использует потоки уровня ОС вообще, старая добрая красная нить / зеленая нить.
что означает "поддержка" - это другой вопрос. Если вы пишете 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
65 (см. комментарии), вот что я получилNew thread #2547 New thread #2548 New thread #2549 Can't create thread: 5 New thread #2550 Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:592) at DieLikeADog.main(DieLikeADog.java:6)
после прочтения сообщения Чарли Мартина мне было любопытно, имеет ли размер кучи какое-либо значение в количестве потоков, которые вы можете создать, и я был полностью ошеломлен результатом.
используя JDK 1.6.0_11 на Vista Home Premium SP1, я выполнил тестовое приложение Чарли с разными размерами кучи, между 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да, размер кучи определенно имеет значение. Но отношение между размером кучи и максимальным количеством потоков обратно пропорционально.
что странно.
Я знаю этот вопрос довольно старый, но просто хочу поделиться своими выводами.
мой ноутбук способен обрабатывать программу, которая порождает
25,000потоки и все эти потоки записывают некоторые данные в базу данных MySql с регулярным интервалом в 2 секунды.я запустил эту программу с
10,000 threadsна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.надеюсь, что это помогает.
The абсолютный теоретический максимум обычно это процесс адресное пространство пользователя делится на размер стека потоков (хотя на самом деле, если вся ваша память зарезервирована для стеков потоков, у вас не будет рабочей программы...).
таким образом, в 32-разрядных окнах, например, где каждый процесс имеет адресное пространство пользователя 2 ГБ, давая каждому потоку размер стека 128K, вы ожидаете абсолютного максимума 16384 потоков (=2*1024*1024 / 128). На практике я нахожу Я могу запустить около 13 000 под XP.
тогда, я думаю, вы по существу в Ли (а)вы можно управлять жонглирование, что многие потоки в коде и не делать очевидно глупые вещи (например, заставляя их все ждать на том же объекте, то вызов notifyAll ()...), и (b) может ли операционная система. В принципе, ответ на вопрос (b) является" да", если ответ на вопрос (a) также является"да".
кстати, можно указать размер стека в конструкторе из потока, вам не нужно (и не стоит) менять параметры виртуальной машины для этого.
Я помню, как слышал разговор Clojure, где он должен был запустить одно из своих приложений на какой-то специализированной машине на выставке с тысячами ядер (9000?), и он загрузил их всех. К сожалению, я не могу найти ссылку прямо сейчас (помочь?).
исходя из этого, я думаю, что можно с уверенностью сказать, что оборудование и ваш код являются ограничивающими факторами, а не JVM.
после игры с классом DieLikeACode Чарли, похоже, что размер стека потоков Java является огромной частью того, сколько потоков вы можете создать.
- Xss set java thread stack size
java-Xss100k DieLikeADog
но, Java имеет исполнитель интерфейс. Я бы использовал это, вы сможете представить тысячи выполняемых задач и иметь исполнителя обрабатывайте эти задачи с фиксированным количеством потоков.
по крайней мере, на Mac OS X 10.6 32bit существует ограничение (2560) операционной системой. Проверьте это поток stackoverflow.
максимальное количество потоков зависит от следующих вещей:
аппаратная конфигурация как микропроцессор, ОЗУ. операционная система, Как ли это 32-бит или 64-бит код внутри метода run. Если код внутри метода run огромен, то один объект потока будет иметь больше требований к памяти
дополнительная информация для современных систем linux (systemd).
есть много ресурсов об этом значений, которые могут потребоваться настройки (например,как увеличить максимальное количество потоков JVM (Linux 64bit)); однако новый предел накладывается через ограничение systemd "TasksMax", которое устанавливает pids.максимум на группу.
для сеансов входа в систему UserTasksMax значение по умолчанию составляет 33% от предела ядра pids_max (обычно 12,288) и может быть переопределено в /etc/systemd / logind.конф.
за услуги DefaultTasksMax значение по умолчанию составляет 15% от предела ядра pids_max (обычно 4,915). Вы можете переопределить его для службы, установив TasksMax в "systemctl edit" или обновить DefaultTasksMax в /etc/systemd/system.conf
2017 года... Класс DieLikeADog.
Новый Поток #92459 Исключение в потоке" main " java.ленг.Исключение OutOfMemoryError: не удается создать новый собственный поток
i7-7700 16 ГБ оперативной памяти
вы можете обрабатывать любое количество потоков; нет никаких ограничений. Я запустил следующий код во время просмотра фильма и использования NetBeans, и он работал правильно/без остановки машины. Я думаю, что вы можете сохранить даже больше потоков, чем эта программа.
class A extends Thread { public void run() { System.out.println("**************started***************"); for(double i = 0.0; i < 500000000000000000.0; i++) { System.gc(); System.out.println(Thread.currentThread().getName()); } System.out.println("************************finished********************************"); } } public class Manager { public static void main(String[] args) { for(double j = 0.0; j < 50000000000.0; j++) { A a = new A(); a.start(); } } }
Comments