Максимальное количество потоков в JVM?
Каково максимальное количество потоков, которые могут поддерживаться виртуальной машиной Java?
Я не объяснил это в своем первоначальном вопросе, но я пытаюсь сравнить JVM и хотел бы попробовать и посмотреть, сколько потоков он может поддерживать одновременно.
Создание потоков в цикле до тех пор, пока не будет выбрано исключение - это вариант, однако мне хотелось бы знать, есть ли лучший способ сделать это.
Ответы
Ответ 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 потоков.