我有一个运行方法的类,并且在类的主要方法定时器调用与该代码的类:的ThreadPoolExecutor OutOfMemoryException异常
Timer timer = new Timer();
timer.scheduleAtFixedRate(new LegacySmsSender(), 0, 2*1000);
在运行方法
,我声明一个ThreadExecutorPool:
ThreadPoolExecutor packetProcessorThreadPool =
new ThreadPoolExecutor(4,
4,
Long.MAX_VALUE,
TimeUnit.DAYS,
new LinkedBlockingQueue<Runnable>(),
new MyThreadFactory("packetProcessorThreadPool")
);
我创建4个PacketProcessors与new PacketProcessor()
做packetProcessorThreadPool.submit
并保持其Future
返回一个列表。那我等他们都在一个循环中完成:
for(Future<?> f:packetProcessorList)
{
System.out.println("before f.get() "+new Date());
f.get();
}
而那些PacketProcessor类的run方法里面,他们宣布的ThreadPoolExecutor和创建和数量1-5000之间提交线程(其通常创建6-7线程),并在PacketProcessor的ThreadPoolExecutor的代码是这样的:
ThreadPoolExecutor commonThreadPool =
new ThreadPoolExecutor(
20,
20,
Long.MAX_VALUE,
TimeUnit.DAYS,
new LinkedBlockingQueue<Runnable>(),
new MyThreadFactory("commonThreadPool"));
,并在结束时,我跑了一段20分钟,我检查的VisualVM,我的内存使用情况和活动线程数量的增加,所有的时间。问题是什么 ?
注:请毫不犹豫地问我要更多信息或问题
这里是一些信息截图:
编辑1:
我270 MB的堆转储。我发现了160MB的char []。我发现像1000-20000个查询字符串。我使用StringBuilder构建查询字符串。为什么他们没有得到GCed?
我试图使用它们作为静态,但它根本没有改变这个分析器上的图像。活动线程永不减少的原因是什么? – kommradHomer