由于之前第三方登录会直接存头像地址,而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~