Apache HttpAsyncClient内存泄漏

时间:2016-01-15 12:58:29

标签: java memory-leaks garbage-collection apache-httpclient-4.x apache-httpasyncclient

我需要在高负载下使用HttpAsyncClient。我像这样创建HttpAsyncClient:

RequestConfig requestConfig = RequestConfig.custom()
        .setConnectTimeout(CONNECT_TIMEOUT)
        .setSocketTimeout(SOCKET_TIMEOUT)
        .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT)
        .build();
HttpAsyncClient client = HttpAsyncClients.custom()
        .setDefaultRequestConfig(createRequestConfig())
        .build();

然后我就这样使用它:

HttpPost request = new HttpPost(url);
request.setEntity(new StringEntity(requestBody, "UTF-8"));
client.execute(request, null)

通常我并不真正关心回复,因此我不会初始化Future<HttpResponse>变量而不会Future.get()。好吧,只是为了澄清(我不认为它与问题有关),我有时会关心回答,但99%的回复对我来说都不是很有趣。

问题在于我做了很多请求(例如每秒300次,并且通过&#34;请求&#34;这里的词我的意思是client.execute() invokation)我终于得到了java.lang.OutOfMemoryError: GC overhead limit exceeded。我试图使用VisualVM来找出发生了什么。我看到java.lang.Object[]char[]java.lang.Stringbyte[]shortchar[]实例计数正在增长(我试图强制GC和限制堆大小,以确保它不正常 - 没有帮助)。增加使用的堆空间也是如此。

是什么导致了这个问题?也许我应该以某种不同的方式使用HttpAsyncClient?我是否需要使用自定义RequestProducerResponseProducer或使用CountDownLatch

UPD 问题是因为PowerMock库

2 个答案:

答案 0 :(得分:3)

HttpAsyncClient不会以任何方式或方式限制请求执行率,以避免阻止#execute方法。可以向客户端提交无限数量的请求,客户端将尽职尽责地将它们全部放入执行队列。这些请求实际执行和从队列中删除的速度有多快,这完全不同,可能取决于很多因素。在您的特定情况下,您尝试处理所有这些请求,每个路由只有2个并发连接,这可能不一定是最佳选择。

PS:/ 老人的抱怨 /人们不应该认为异步客户端因某种原因会更快。除非用于特定用例并以特定方式使用,否则它们不会被使用。可以肯定的是,除非非常小心,否则很容易最终使用异步客户端。

答案 1 :(得分:0)

原因是我使用PowerMock来运行我的测试。没有PowerMock,一切正常。

相关问题