记一次因ThreadPoolExecutor多线程导致服务器内存压满问题

经过下载服务器内存数据得知是通过多线程业务处理查询list集合数据没有得到正确释放导致的。

首先先了解一下list集合数据的存放和回收(可能说的不对,请谅解【挠头】)

存放:

当我们创建一个list或者从数据库查询出的数据用list集合进行接收时,比如

List<User> user = new ArrayList<User>;

user.add("张三");

user.add("李四");

user.add("王二麻子");

这个时候我们实际上是在堆内存中创建了一个list实例,并将list的引用放在栈内存的变量中

user是一个引用,存放在栈内存中,List<User>对象以及集合里的元素("张三","李四","王二麻子")存放在堆内存里。

回收:

当我们业务处理完成,且调用方法执行结束后,伟大而又优秀的gc就会把内存里的数据回收掉,来释放内存空间。

好,接下来进入今天的正题,废话不多说,直接贴代码

java 复制代码
public void autoMatic() throws InterruptedException {
		List<ChannelShopTemplate> template = baseService.list();//查询关联商城模板的渠道
		int taskCount = template.size();
		int maxThreadCount = template.size(); // 最多同时执行多少个任务
		ThreadPoolExecutor executor = new ThreadPoolExecutor(maxThreadCount, // 核心线程数和最大线程数都为5
				maxThreadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
		for (int i = 0; i < taskCount; i++) {
			executor.submit(new Task(template.get(i).getTemplateId()));
			System.out.println("当前线程池中线程数:" + executor.getPoolSize());
			// 如果当前线程池中的线程数量已经达到最大线程数,暂停1秒钟后继续添加任务
			while (executor.getPoolSize() == maxThreadCount) {
				Thread.sleep(1000);
			}
		}
		executor.shutdown();
	}

每个线程都会从数据库查询大量数据,如果能正常释放回收,那么就没问题,

经过模拟排查定位出服务器内存压满的原因就是压根没回收,中间的一行代码Thread.sleep(1000);因为用的是while就会一直在这里睡,直接眼睛一闭不睁了,所以导致后面线程关闭和gc回收工作就卡住了。问题解决,心也碎了。

行了,结束,今天就到辶

相关推荐
我星期八休息14 分钟前
Linux I/O多路转接—epoll
java·linux·运维·服务器·开发语言·jvm·算法
学长毕业设计40 分钟前
基于springboot的云南中草药知识普及管理网站的设计与开发(源码+文档+讲解视频)
java·spring boot·后端
大模型码小白42 分钟前
AI 提示词专栏:使用系统指令(System Prompt)实现全局约束
java·大数据·运维·开发语言·人工智能·python·prompt
土星云SaturnCloud43 分钟前
超轻量 OCR 实战:PP-OCR 边缘部署实践
服务器·人工智能·ai·ocr·边缘计算
cxoptics1 小时前
蓝宝石的轴向在窗片和偏振片中起的作用
java
AI备忘录1 小时前
(十六)GRE/IPSec 隧道配置命令五厂商对照:华为 华三 锐捷 迈普 思科
运维·服务器·网络·网络协议·网络安全·华为
wuminyu1 小时前
Java FFM处理网络读写事件源码剖析
java·linux·c语言·jvm·c++
小江的记录本1 小时前
【AI Agent】《2026年9月 AI Agent全栈开发技术选型专项面试宝典》
java·spring boot·python·spring·ai·面试·ai编程
DO_Community2 小时前
面向 AI 工作负载,单核性能提升 30%:DigitalOcean v5 Droplets 云服务器正式上线
运维·服务器·人工智能
梦梦代码精2 小时前
《LikeShop全产品技术硬核拆解:ThinkPHP8+Vue3+UniApp架构,私有化部署与二次开发实战指南》
java·低代码·系统架构·php·开源软件