gpt4 book ai didi

java - threadPoolExecutor 内存溢出异常

转载 作者:行者123 更新时间:2023-12-02 00:12:27 25 4
gpt4 key购买 nike

我有一个带有 run 方法的类,该类的 main 方法中的计时器正在使用以下代码调用该类:

Timer timer = new Timer();
timer.scheduleAtFixedRate(new LegacySmsSender(), 0, 2*1000);

在run方法中,我声明了一个ThreadExecutorPool:

ThreadPoolExecutor packetProcessorThreadPool =
new ThreadPoolExecutor(4,
4,
Long.MAX_VALUE,
TimeUnit.DAYS,
new LinkedBlockingQueue<Runnable>(),
new MyThreadFactory("packetProcessorThreadPool")
);

我使用new PacketProcessor()创建4个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,我的内存使用量和 Activity 线程数一直在增加。问题是什么 ?

注意:请随时向我询问更多信息或问题

这是包含一些信息的屏幕截图:

enter image description here

编辑 1:

我进行了 270 MB 的堆转储。我发现了 160mb 的 char[] 。我发现了大约 1000-2000 千个查询字符串。我使用 StringBuilder 构建查询字符串。为什么他们没有获得GCed?

最佳答案

执行器应该在应用程序启动时声明一次并重用。否则,您也可以根据需要创建单独的线程。如果您在应用程序执行期间不断创建新的执行程序,它们的线程将继续运行,因此线程数将不断增加。

因此,只需使用 DI 框架创建执行器并将它们注入(inject)到您的代码中即可。或者,如果它是一个小项目,请将它们放在静态字段中。

关于java - threadPoolExecutor 内存溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12472857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com