gpt4 book ai didi

java - Apache HttpAsyncClient 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 08:05:48 26 4
gpt4 key购买 nike

我需要在高负载下使用 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 次,这里的“请求”一词是指 client.execute() 调用)我最终得到 java.lang.OutOfMemoryError: GC overhead limit exceeded .我尝试使用 VisualVM 来了解发生了什么。我看到了 java.lang.Object[] , char[] , java.lang.String , byte[] , short , char[]实例数在增长(我试图强制执行 GC 并限制堆大小以确保它不正常 - 没有帮助)。已用堆空间的增长也是如此。

是什么导致了这个问题?也许我应该使用 HttpAsyncClient一些不同的方式?我需要使用自定义 RequestProducer 吗? , ResponseProducer或使用 CountDownLatch

UPD问题是因为 PowerMock 库

最佳答案

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

PS:/老人的牢骚/人们不应该假设异步客户端会出于某种原因更快。除非用于特定用例并以特定方式使用,否则它们不会。可以肯定的是,除非非常小心,否则很容易在异步客户端上使用更多内存。

关于java - Apache HttpAsyncClient 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34811632/

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