我不能在具有15G内存的Linux机器上创建超过32k的Java线程.
您可以使用示例程序找出当前线程限制.
如果遇到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 x线程数).
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系统的附加信息.
关于这些可能需要调整的值的资源很多(另一个答案是大多数的好的来源); 但是,通过系统化的"TasksMax"限制,在cgroup上设置pids.max,会产生新的限制.
对于登录会话,UserTasksMax默认为内核限制pids_max的33%(通常为12,288),可以在/etc/systemd/logind.conf中覆盖.
对于服务,DefaultTasksMax默认值是内核限制pids_max的15%(通常为4,915).您可以通过在"systemctl edit"中设置TasksMax或在/etc/systemd/system.conf中更新DefaultTasksMax来覆盖服务.