gpt4 book ai didi

Java ThreadPoolExecutor 处理时挂起

转载 作者:行者123 更新时间:2023-12-01 11:12:26 25 4
gpt4 key购买 nike

我有一个自定义线程池执行器

public class CustomTPExecutor extends ThreadPoolExecutor
{

/* Constructor called from my processor */

public CustomTPExecutor (int corePoolSize, int maxPoolSize, long keepAliveTime,
TimeUnit timeUnit, BlockingQueue<Runnable> blockingQueue,
ThreadFactory threadFactory,Processor processor)
{
super(corePoolSize, maxPoolSize, keepAliveTime, timeUnit, blockingQueue,threadFactory);
this.processor = processor;
}
@Override
protected void afterExecute(Runnable paramRunnable, Throwable paramThrowable)
{
super.afterExecute(paramRunnable, paramThrowable);
/* Notify the processor to get more records */
}
}

在我的处理器中,我将为此 customTPExecutor 创建实例并向其提交超过 1000 个任务。最大池大小为 5。

为了将其提交给执行者,我们使用它。

while(iterating map events containing 1000+records) {
CustomThread tt = new TxnTCustomThread(eventMap.get(key), key,maxDate,connPool,connPool.getConnection(),email);
executor.submit(tt);
}

处理完所有记录后,我们将调用执行器关闭方法。

我们注意到的一件事是,当线程执行时,它会在处理过程中挂起一段时间。它暂停一分钟左右,然后继续处理记录。我不确定这是什么原因。

我假设这是因为垃圾收集没有正确发生。我无法从日志中获取任何内容来对此进行调试。在此过程中,java 的内存消耗大大减少。

任何有关如何解决此问题的建议都将非常有帮助。

最佳答案

有一种称为“stop-the-world”GC 的东西,粗略地说,这意味着 JVM 决定需要进行一次“深度清理”,从而暂时停止所有线程以防止引用发生更改。这是不希望的,因此 GC 通常会尝试避免它,而倾向于在后台执行 GC。不过,这种情况肯定有可能发生,特别是如果您使用所有核心进行计算(这可能会阻止后台 GC)并且生成大量对象。

如果您在线搜索“stop-the-world GC”,您会得到一些不错的结果。

关于Java ThreadPoolExecutor 处理时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32197184/

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