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

网友投稿 593 2023-02-21

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

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

CloseableHttpClient httpClient = HttpClients.custom()

.setConnectionManager(connectionManager)

.setMaxConnTotal(400)

.setMaxConnPerRoute(150)

.evictExpiredConnections()

.build();

evictExpiredConnections 这个配置作用:

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

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

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

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

List closeablesCopy = closeables != null ? new ArrayList(closeables) : null;

if (!this.connManagerShared) {

if (closeablesCopy == null) {

closeablesCopy = new ArrayList(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;

}

}

});

}

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解HttpClient用法
下一篇:移动应用程序原生开发(移动应用开发以后是干嘛的)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~