Я хочу узнать максимальное количество потоков, поддерживаемых jVM в конфигурации по умолчанию, и выяснить, какие изменения конфигурации могут увеличить это число.
среда
- VirtualBox 7 + debian-12.7.0-amd64-DVD-1.iso< /li>
Java 21 + SpringBoot3
Linux TestDebian 6.1.0-27-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.115-1 (2024-11-01) x86_64 GNU/Linux
koril@TestDebian: ~/project$ java -version
версия Java "21.0.5" 15 октября 2024 г. LTS
Среда выполнения Java(TM) SE (сборка 21.0.5+9-) LTS-239)
Java HotSpot(TM) 64-битная серверная виртуальная машина (сборка 21.0.5+9-LTS-239, смешанный режим, общий доступ)
мой код
контроллер:
Код: Выделить всё
@RestController
@RequestMapping("/thread")
public class ThreadController {
@GetMapping("/add")
public String add(int num) {
for (int i = 0; i < num; i++) {
new Thread(new TestTask()).start();
}
return "Add " + num + " threads success";
}
}
Код: Выделить всё
public class TestTask implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
Я использую jconsole, чтобы увидеть количество потоков jvm, и команду Linux top, чтобы увидеть использование памяти.
Это стартовый jar-скрипт:
Код: Выделить всё
#!/bin/bash
java \
-Djava.rmi.server.hostname=192.168.0.202 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-jar study-java-thread.jar
java.lang.OutOfMemoryError: невозможно создать собственный поток: возможно недостаточно памяти или достигнуты ограничения процесса/ресурса
результаты тестирования
- 1 ЦП 1 ГБтемы: 2400, использование памяти: 51,8%
- 1 ЦП 2 ГБ
потоков: 5057, использование памяти: 31,2 % - 1 ЦП 4 ГБ
потоки: 9985, использование памяти: 22,7% - 1 ЦП 8 ГБ
потоки: 9985, использование памяти: 12% - 1ЦП 16 ГБ
потоков: 9985, использование памяти: 6,3%
Подробнее здесь: https://stackoverflow.com/questions/792 ... r-debian12