在15G内存的Linux机器上,我不能创build超过32k的Java线程。
您可以使用示例程序找出当前的线程限制。
如果Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
遇到Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
,请检查以下内容:
在小型记忆机器上
每个Java线程都使用自己的堆栈内存。 默认堆栈大小是1024k(= 1M)。 您可以像java -Xss512k ...
一样减小堆栈大小。 如果堆栈大小太低,JVM将无法启动。
并注意堆内存配置:(初始) -Xms
和(最大) -Xmx
。 分配给堆的内存越多,堆栈的可用内存就越少。
系统限制
ulimit -a
某些值可能会影响线程限制。
max memory size
– 在大多数64位机器上无限制 max user processes
– Linux将进程视为线程 virtual memory
– 在大多数64位机器上无限制。 虚拟内存使用增加了-Xss配置(默认为1024k) 您可以通过(临时)运行ulimit
命令或(永久)编辑/etc/security/limits.conf
来更改这些值。
sys.kernel.threads-max
这个值是系统全局(包括非JVM进程)的最大线程数。 检查cat /proc/sys/kernel/threads-max
,并在必要时增加。
echo 999999 > /proc/sys/kernel/threads-max
要么
sys.kernel.threads-max = 999999
在/etc/sysctl.conf
中永久更改。
sys.kernel.pid_max
如果cat /proc/sys/kernel/pid_max
与当前限制类似,请增加此值。 Linux将线程视为进程。
echo 999999 > /proc/sys/kernel/pid_max
要么
sys.kernel.pid_max = 999999
在/etc/sysctl.conf
中永久更改。
你也可能需要增加sys.vm.max_map_count
。
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
应该至少(2个线程数)。
Attempt to protect stack guard pages failed.
和OpenJDK 64-Bit server VM warning: Attempt to deallocate stack guard pages failed.
错误消息由JavaThread :: create_stack_guard_pages()发出,并调用os :: guard_memory()。 在Linux中,这个函数是mprotect()。
echo 1999999 > /proc/sys/vm/max_map_count
要么
sys.vm.max_map_count = 1999999
在/etc/sysctl.conf
中永久更改。
现代(systemd)linux系统的附加信息。
有很多关于这个值的资源可能需要调整(另一个答案是其中大多数的一个很好的来源); 然而,通过在cgroup上设置pids.max的系统“TasksMax”限制来施加新的限制。
对于登录会话, UserTasksMax默认为内核限制pids_max的33%(通常为12,288),可以在/etc/systemd/logind.conf中覆盖。
对于服务, DefaultTasksMax默认值是内核限制pids_max的15%(通常为4,915)。 您可以通过在“systemctl edit”中设置TasksMax或更新/etc/systemd/system.conf中的DefaultTasksMax来覆盖该服务