Ke zjištění aktuálního limitu vláken můžete použít ukázkový program.
Pokud narazíte na Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
, zkontrolujte tyto:
-
V malých paměťových strojích
Každé vlákno Java spotřebovává svou vlastní zásobníkovou paměť. Výchozí velikost zásobníku je 1024k (=1M). Velikost zásobníku můžete zmenšit jako
java -Xss512k ...
. JVM nelze spustit, pokud je velikost zásobníku příliš malá.A pozor na konfigurace haldy paměti:(počáteční)
-Xms
a (maximálně)-Xmx
. Čím více paměti je přiděleno haldě, tím méně dostupné paměti pro zásobník. -
Systémové limity
Některé hodnoty v
ulimit -a
může ovlivnit limit vlákna.max memory size
- neomezeně na většině 64bitových počítačůmax user processes
- linux zachází s vlákny jako s procesyvirtual memory
- neomezeně na většině 64bitových strojů. využití virtuální paměti je zvýšeno o konfiguraci -Xss (výchozí 1024k)
Tyto hodnoty můžete změnit (dočasným) spuštěním
ulimit
příkaz nebo (trvalá) úprava/etc/security/limits.conf
. -
sys.kernel.threads-max
Tato hodnota je systémově globální (včetně procesů jiných než JVM) maximální počet vláken. Zkontrolujte
cat /proc/sys/kernel/threads-max
a v případě potřeby zvyšte.echo 999999 > /proc/sys/kernel/threads-max
nebo
sys.kernel.threads-max = 999999
v/etc/sysctl.conf
trvale změnit. -
sys.kernel.pid_max
Pokud
cat /proc/sys/kernel/pid_max
je podobný aktuálnímu limitu, zvyšte jej. Linux zachází s vlákny jako s procesy.echo 999999 > /proc/sys/kernel/pid_max
nebo
sys.kernel.pid_max = 999999
v/etc/sysctl.conf
trvale změnit.A možná budete muset zvýšit
sys.vm.max_map_count
. -
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
by mělo být alespoň (2 x počet vláken).Attempt to protect stack guard pages failed.
aOpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
chybové zprávy vysílá JavaThread::create_stack_guard_pages() a volá os::guard_memory(). V Linuxu je tato funkce mprotect().echo 1999999 > /proc/sys/vm/max_map_count
nebo
sys.vm.max_map_count = 1999999
v/etc/sysctl.conf
trvale změnit.
Další informace pro moderní (systemd) linuxové systémy.
Existuje mnoho zdrojů o těchto hodnotách, které mohou vyžadovat ladění (druhá odpověď je pro většinu z nich dobrým zdrojem); nicméně je zaveden nový limit prostřednictvím systemd limitu "TasksMax", který nastavuje pids.max na cgroup.
Pro přihlašovací relace je výchozí hodnota UserTasksMax 33 % limitu jádra pids_max (obvykle 12 288) a lze ji přepsat v /etc/systemd/logind.conf.
Pro služby je výchozí hodnota DefaultTasksMax 15 % limitu jádra pids_max (obvykle 4 915). Můžete jej pro službu přepsat nastavením TasksMax v "systemctl edit" nebo aktualizací DefaultTasksMax v /etc/systemd/system.conf
Narazil jsem na podobný problém v programu Python a fungovalo mi následující. Toto je založeno na maczniakově odpovědi výše a https://superuser.com/questions/1219960/cannot-edit-proc-sys-kernel-threads-max.
echo kernel.threads-max = 1073741823 >> /etc/sysctl.conf && echo 1073741823 > /proc/sys/kernel/threads-max
echo kernel.pid_max = 999999 >> /etc/sysctl.conf && echo 999999 > /proc/sys/kernel/pid_max
echo vm.max_map_count = 2147483646 >> /etc/sysctl.conf && echo 2147483646 > /proc/sys/vm/max_map_count
echo vm.overcommit_memory = 1 >> /etc/sysctl.conf && echo 1 > /proc/sys/vm/overcommit_memory
echo fs.inotify.max_user_instances = 256 >> /etc/sysctl.conf && echo 256 > /proc/sys/fs/inotify/max_user_instances
sysctl -p
Také jsem musel nastavit DefaultTasksMax
v /etc/systemd/system.conf
(nebo /etc/systemd/user.conf
pro uživatelem provozované služby) na DefaultTasksMax=unlimited
.
Systemd také uplatňuje limit pro programy spouštěné z přihlašovacího prostředí. Tyto výchozí hodnoty jsou 4096 na uživatele (bude zvýšeny na 12288) a jsou nakonfigurovány jako UserTasksMax v sekci [Login]
/etc/systemd/logind.conf
.
To je z této otázky StackExchange. Nastavení mého UserTasksMax
na UserTasksMax=999999
pracoval pro mě.