关于HttpClient 引发的线程太多导致FullGc的问题

 更新时间:2021年01月11日 14:18:54   作者:马力2020  
这篇文章主要介绍了关于HttpClient 引发的线程太多导致FullGc的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
CloseableHttpClient httpClient = HttpClients.custom()
  .setConnectionManager(connectionManager)
  .setMaxConnTotal(400)
  .setMaxConnPerRoute(150)
  .evictExpiredConnections()
  .build();

evictExpiredConnections 这个配置作用:

设置一个定时线程,定时清理闲置连接,可以将这个定时时间设置为 keep alive timeout 时间的一半以保证超时前回收

每个httpClient 对象都会有自己独立的定时线程

这样如果应用中httpClient对象很多,就会导致上图中线程太多

源码中,如果设置了evictExpiredConnections 会有下面一段逻辑

 List<Closeable> closeablesCopy = closeables != null ? new ArrayList<Closeable>(closeables) : null;
  if (!this.connManagerShared) {
   if (closeablesCopy == null) {
    closeablesCopy = new ArrayList<Closeable>(1);
   }
   final HttpClientConnectionManager cm = connManagerCopy;
 
   if (evictExpiredConnections || evictIdleConnections) {
    final IdleConnectionEvictor connectionEvictor = new IdleConnectionEvictor(cm,
      maxIdleTime > 0 ? maxIdleTime : 10, maxIdleTimeUnit != null ? maxIdleTimeUnit : TimeUnit.SECONDS,
      maxIdleTime, maxIdleTimeUnit);
    closeablesCopy.add(new Closeable() {
 
     @Override
     public void close() throws IOException {
      connectionEvictor.shutdown();
      try {
       connectionEvictor.awaitTermination(1L, TimeUnit.SECONDS);
      } catch (final InterruptedException interrupted) {
       Thread.currentThread().interrupt();
      }
     }
 
    });
    connectionEvictor.start();
   }
   closeablesCopy.add(new Closeable() {
 
    @Override
    public void close() throws IOException {
     cm.shutdown();
    }
 
   });
  }

IdleConnectionEvictor 对象是

public final class IdleConnectionEvictor {
 
 private final HttpClientConnectionManager connectionManager;
 private final ThreadFactory threadFactory;
 private final Thread thread;
 private final long sleepTimeMs;
 private final long maxIdleTimeMs;
 
 private volatile Exception exception;
 
 public IdleConnectionEvictor(
   final HttpClientConnectionManager connectionManager,
   final ThreadFactory threadFactory,
   final long sleepTime, final TimeUnit sleepTimeUnit,
   final long maxIdleTime, final TimeUnit maxIdleTimeUnit) {
  this.connectionManager = Args.notNull(connectionManager, "Connection manager");
  this.threadFactory = threadFactory != null ? threadFactory : new DefaultThreadFactory();
  this.sleepTimeMs = sleepTimeUnit != null ? sleepTimeUnit.toMillis(sleepTime) : sleepTime;
  this.maxIdleTimeMs = maxIdleTimeUnit != null ? maxIdleTimeUnit.toMillis(maxIdleTime) : maxIdleTime;
  this.thread = this.threadFactory.newThread(new Runnable() {
   @Override
   public void run() {
    try {
     while (!Thread.currentThread().isInterrupted()) {
      Thread.sleep(sleepTimeMs);
      connectionManager.closeExpiredConnections();
      if (maxIdleTimeMs > 0) {
       connectionManager.closeIdleConnections(maxIdleTimeMs, TimeUnit.MILLISECONDS);
      }
     }
    } catch (final Exception ex) {
     exception = ex;
    }
 
   }
  });
 }

会出现一个线程,这个线程里面就是去关闭超时不用的闲置链接

到此这篇关于关于HttpClient 引发的线程太多导致FullGc的问题的文章就介绍到这了,更多相关HttpClient 引发的线程太多导致FullGc内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 新手初学Java对象内存构成

    新手初学Java对象内存构成

    这篇文章主要介绍了深入理解JVM之Java对象的创建、内存布局、访问定位,结合实例形式详细分析了Java对象的创建、内存布局、访问定位相关概念、原理、操作技巧与注意事项,需要的朋友可以参考下
    2021-07-07
  • 基于json解析神器 jsonpath的使用说明

    基于json解析神器 jsonpath的使用说明

    这篇文章主要介绍了基于json解析神器 jsonpath的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot利用Junit动态代理实现Mock方法

    SpringBoot利用Junit动态代理实现Mock方法

    说到Spring Boot 单元测试主要有两个主流集成分别是Mockito,Junit,这个各有特点,在实际开发中,我想要的测试框架应该是这个框架集成者,本文给大家介绍了SpringBoot利用Junit动态代理实现Mock方法,需要的朋友可以参考下
    2024-04-04
  • Java代码审计的一些基础知识你知道吗

    Java代码审计的一些基础知识你知道吗

    这篇文章主要介绍了基于Java的代码审计功能的基础知识,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09
  • 在同一个类中调用带有@Transactional注解的方法示例

    在同一个类中调用带有@Transactional注解的方法示例

    这篇文章主要为大家介绍了在同一个类中调用带有@Transactional注解的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java判断一个字符串是不是一个数字的解决思路

    Java判断一个字符串是不是一个数字的解决思路

    这篇文章主要给大家介绍了关于Java判断一个字符串是不是一个数字的解决思路,判断一个字符串是否为数字是Java开发中很常见的业务需求,实现这个判断有很多种方式,需要的朋友可以参考下
    2023-08-08
  • Java接入支付宝授权第三方登录的完整步骤

    Java接入支付宝授权第三方登录的完整步骤

    不管是支付宝支付,还是微信支付,还是银联支付等,大部分的支付流程都是相似的,这篇文章主要给大家介绍了关于Java接入支付宝授权第三方登录的相关资料,使用支付宝的沙盒环境示例,需要的朋友可以参考下
    2021-07-07
  • Java下http下载文件客户端和上传文件客户端实例代码

    Java下http下载文件客户端和上传文件客户端实例代码

    这篇文章主要介绍了Java下http下载文件客户端和上传文件客户端实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • rabbitmq消息ACK确认机制及发送失败处理方式

    rabbitmq消息ACK确认机制及发送失败处理方式

    这篇文章主要介绍了rabbitmq消息ACK确认机制及发送失败处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java实现计算图中两个顶点的所有路径

    Java实现计算图中两个顶点的所有路径

    这篇文章主要为大家详细介绍了如何利用Java语言实现计算图中两个顶点的所有路径功能,文中通过示例详细讲解了实现的方法,需要的可以参考一下
    2022-10-10

最新评论