我有一个带有 run 方法的类,并且该类的 main 方法中的计时器正在使用以下代码调用该类:
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 个 PacketProcessor,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-2000 千个查询字符串。我使用 StringBuilder 构建查询字符串。为什么他们没有获得 GCed ?