I cannot create more than 32k Java threads in Linux machine with 15G memory.
You can use a sample program to find out the current threads limit.
If you encounter Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
, check these:
In small memory machines
Every Java thread consume its own stack memory. Default stack size is 1024k (= 1M). You can reduce the stack size like java -Xss512k ...
. JVM cannot be started if the stack size is too low.
And beware heap memory configurations: (initial) -Xms
and (maximum) -Xmx
. The more memory is allocated to heap, the less available memory for stack.
System limits
Some values in ulimit -a
can affect a thread limit.
max memory size
- unlimited on most 64bit machinesmax user processes
- linux treats threads like processesvirtual memory
- unlimited on most 64bit machines. virtual memory usage is increased by -Xss configuration (default 1024k)You can change these values by (temporal) running ulimit
command or (permanent) editing /etc/security/limits.conf
.
sys.kernel.threads-max
This value is the system-global (including non-JVM processes) maximum number of threads. Check cat /proc/sys/kernel/threads-max
, and increase if necessary.
echo 999999 > /proc/sys/kernel/threads-max
orsys.kernel.threads-max = 999999
in /etc/sysctl.conf
to change permanently.
sys.kernel.pid_max
If cat /proc/sys/kernel/pid_max
is similar to current limit, increase this. Linux treats threads like processes.
echo 999999 > /proc/sys/kernel/pid_max
orsys.kernel.pid_max = 999999
in /etc/sysctl.conf
to change permanently.
And you may need to increase sys.vm.max_map_count
, too.
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
should be at least (2 x thread-count).
Attempt to protect stack guard pages failed.
and OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
error messages are emitted by JavaThread::create_stack_guard_pages(), and it calls os::guard_memory(). In Linux, this function is mprotect().
echo 1999999 > /proc/sys/vm/max_map_count
orsys.vm.max_map_count = 1999999
in /etc/sysctl.conf
to change permanently.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With