Java ThreadPoolExecutor 在处理时挂起
Java ThreadPoolExecutor Hangs while processing
我有一个自定义线程池执行器
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 决定它需要这样一个 "deep clean",它会暂时停止所有线程以防止引用发生变化。这是不希望的,因此 GC 通常会尝试避免它以支持在后台执行 GC。不过,这肯定会发生,特别是如果您使用所有核心进行计算(这可能会阻止后台 GC)并且您正在生成大量对象。
如果您在线搜索 "stop-the-world GC",您会得到一些不错的结果。
我有一个自定义线程池执行器
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 决定它需要这样一个 "deep clean",它会暂时停止所有线程以防止引用发生变化。这是不希望的,因此 GC 通常会尝试避免它以支持在后台执行 GC。不过,这肯定会发生,特别是如果您使用所有核心进行计算(这可能会阻止后台 GC)并且您正在生成大量对象。
如果您在线搜索 "stop-the-world GC",您会得到一些不错的结果。