我需要在高负载下使用 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[]
增长(我试图强制 GC 并限制堆大小以确保它不正常 - 没有帮助)。使用的堆空间也在增加。short
char[]
是什么导致了这个问题?也许我应该使用HttpAsyncClient
一些不同的方式?我需要使用自定义RequestProducer
还是ResponseProducer
使用CountDownLatch
?
UPD 问题是因为PowerMock库