Подтвердить что ты не робот

Максимальное количество потоков в JVM?

Каково максимальное количество потоков, которые могут поддерживаться виртуальной машиной Java?

Я не объяснил это в своем первоначальном вопросе, но я пытаюсь сравнить JVM и хотел бы попробовать и посмотреть, сколько потоков он может поддерживать одновременно.

Создание потоков в цикле до тех пор, пока не будет выбрано исключение - это вариант, однако мне хотелось бы знать, есть ли лучший способ сделать это.

4b9b3361

Ответ 1

Написание цикла, который создает новые потоки, пока он не взорвется, - это окончательный способ узнать. Возможно, вы увидите, что производительность сильно ухудшается, прежде чем она действительно умрет.

Я не знаю, есть ли какой-либо параметр конфигурации или другой встроенный лимит в JVM с моей головы. На практике я никогда не сталкивался с лимитом. Конечно, рано или поздно у вас закончится память, возможно, какой-то другой ресурс.

Я подозреваю, что ограничение количества потоков как таковое не существует, а скорее ресурсов, связанных с потоком. То есть вы можете увидеть, что у вас может быть 10 000 потоков, если все они работают только с одним маленьким классом с несколькими байтами данных каждый, но число быстро падает, когда у каждого из них есть массив из 10 миллионов строк.

Ответ 2

В вашей операционной системе и конфигурации оборудования будут установлены некоторые ограничения.

Чтобы поднять количество параллельных потоков, вы должны уменьшить стандартную комбинацию java -Xss 64k.

  • 32-битный JVM Oracle будет по умолчанию 320kb размер стека для каждого потока.
    • Для 32-разрядной JVM с 2 ГБ адресной памяти это даст вам максимум 6,5 тыс. потоков.
  • Oracle 64-бит JVM будет по умолчанию для 1M размера стека для потока.
    • Для каждого гигабайта памяти вы получите 1024 потока, используя значения по умолчанию.
  • Только для Linux:
    • ulimit -a предоставит вам настроенные ограничения для пользовательских процессов и памяти
    • Вы получите только 32K уникальных PID в linux cat /proc/sys/kernel/pid_max - максимум 32k процессов.
    • Вы получите только 255k потоков cat /proc/sys/kernel/threads-max

Ответ 3

Предел, если он есть, будет наложен операционной системой, а не jvm

Ответ 4

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

Во-первых, вопрос, как долго жить, это ваша нить. Короткий живой поток вряд ли стоит усилий. С другой стороны, большие вычисления имеют смысл.

Во-вторых, сколько памяти будет потреблять каждый поток. Возьмите объем памяти, который требуется каждому потоку, и разделите его на объем доступной памяти. Вы не должны создавать больше потоков, чем это.

В-третьих, сколько у вас процессоров. Вы не должны создавать больше потоков, чем процессоры. Фактически, вы должны рассмотреть хотя бы одно меньше, чем количество потоков. На ноутбуке с четырьмя процессорами Windows никогда не должно быть больше трех потоков, если требуется эффективная обработка.

Наконец, что делает ваш поток. Если он читает и записывает на жесткий диск, то у вас может быть больше потоков, чем количество процессоров, так как ему придется ждать ответа устройства. При определении количества потоков рассмотрите следующий метод:

public static int recommendedThreadCount()
{
    int mRtnValue = 0;
    Runtime runtime = Runtime.getRuntime();
    long maxMemory = runtime.maxMemory();
    long mTotalMemory = runtime.totalMemory();
    long freeMemory = runtime.freeMemory();
    int mAvailableProcessors = runtime.availableProcessors();

    long mTotalFreeMemory = freeMemory + (maxMemory - mTotalMemory);
    mRtnValue = (int)(mTotalFreeMemory/4200000000l);

    int mNoOfThreads = mAvailableProcessors-1;
    if(mNoOfThreads < mRtnValue) mRtnValue = mNoOfThreads;

    return mRtnValue;
}

Ответ 5

Максимальное количество потоков также может быть ограничено реализацией JVM и кабиной, отличной от виртуальной машины Java, на другой виртуальной машине Java. Например, в Jikes RVM массив используется для хранения информации о потоках (см. Строку 54 в Исходный код Jikes RVM Scheduler). В этом случае максимальное количество потоков не может превышать максимальный размер массива в Java, что составляет около 2 ^ 32. Но вы, скорее всего, столкнетесь с другими ограничениями ОС или аппаратными ограничениями до достижения 2 ^ 32 потоков.