部署Spring Boot/Batch应用到CentOS7时出现无法创建本地线程OOM错误如何解决
错误诱因
该错误是当前操作系统用户的线程/进程数限制过低导致的:
Linux系统的ulimit -u(max user processes)参数限制了单个用户可以创建的进程+线程总数量,你当前用户的该值仅为35,而Spring Boot应用默认启动时需要创建数十个线程(包括Tomcat工作线程、JVM GC线程、Spring框架内置调度线程、业务线程等),直接触达资源上限,操作系统无法为JVM分配新的线程资源,因此抛出unable to create native thread的OOM错误。
系统总线程数365、负载0.15均处于正常区间,不存在全局资源不足问题,仅为用户级的线程数限制导致。
可自行尝试的修复方案
- 禁用web容器:你开发的是Spring Batch批处理应用,不需要对外提供web服务,在application.properties/yml中添加配置
spring.main.web-application-type=none,完全禁用Tomcat相关组件,可减少10~20个线程的占用。 - 调小JVM默认线程数:启动jar时添加JVM参数限制GC线程数量,启动命令修改为:
避免JVM按照服务器CPU核数默认开启大量GC线程。./java -XX:ParallelGCThreads=2 -XX:ConcGCThreads=1 -jar /home/webadmin/notartel-import-data-batch/UpdateInfoBatch-0.0.1-SNAPSHOT.jar - 调小框架线程池配置:如果必须保留web容器,可添加配置
server.tomcat.max-threads=5、server.tomcat.min-spare-threads=1;调整Spring Batch线程池配置spring.task.execution.pool.core-size=2、spring.task.execution.pool.max-size=3,进一步压缩线程占用。 - 清理当前用户冗余进程:执行
ps -u webadmin查看你当前用户名下运行的所有进程,杀掉无意义的残留进程,释放已占用的线程额度。
需要运维调整的配置参数
- 调整用户级进程/线程数限制:修改
/etc/security/limits.conf文件,添加如下配置(webadmin替换为你的实际用户名):
将单用户可创建的最大线程/进程数上调到至少2048,满足普通Java应用的运行需求。webadmin soft nproc 2048 webadmin hard nproc 4096 - 调整systemd任务上限:CentOS7的systemd默认会对用户任务数做额外限制,优先级高于limits.conf,需要修改对应用户的service配置,将
TasksMax参数调整为2048以上,或者设置为infinity。 - 可选:如果后续应用有内存占用增长需求,可同步调大对应用户的内存限制
soft as、hard as参数,避免后续出现内存不足问题。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

