java.lang.OutOfMemoryError: unable to create new native thread 问题排查

2 篇文章 0 订阅
2 篇文章 0 订阅

场景重现

由于之前第三方登录会直接存头像地址,而h5网页会出现跨域的问题,然后接到任务是将第三方头像地址转存到七牛云上

使用的多线程池Executors.newFixedThreadPool,不然速度太慢了

// 获取空闲进程数
int processors = Runtime.getRuntime().availableProcessors();
// 创建多线程池
ExecutorService executorService = Executors.newFixedThreadPool(processors * 2);
// TODO 将第三方头像转存到七牛云

从代码上来看没有问题,但问题就出现在七牛云的上传源码上

源码会再次创建新的线程进行图片上传,然后由于线程数堆积

导致最后抛出java.lang.OutOfMemoryError: unable to create new native thread异常

解决思路

参考地址:

https://www.cnblogs.com/hrhguanli/p/4509544.html

https://blog.csdn.net/thwsir/article/details/86480956

https://blog.csdn.net/wchgogo/article/details/78185643

https://www.cnblogs.com/flying-tiger/p/5956926.html

总共看了4个解决答案,前三个都没有解决我的问题,直到最后一个参考地址

使用 ulimit -a 查看进程资源的限制

发现了一个属性 max user processes

服务器上用的是tomcatuser用户,而它的max user processes 只有4096,这就是导致异常的罪魁祸首

暂时没去改动,切换成root用户再次使用 ulimit -a 命令查看 max user processes, 结果有127977

直接用root启动jar包,然后再次执行功能,没再报错!

本次核心命令

ulimit -a #查看进程资源限制
ps -eLf | wc -l #查看进程数

 

如果帮到你,请点个赞吧 O(∩_∩)O~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值