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



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

479   13  

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 6 5 (см. комментарии), вот что я получил

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

      Ничего не найдено.