[prev in list] [next in list] [prev in thread] [next in thread]
List: httpclient-users
Subject: Re: question about Unhandled IOException in HttpClient.execute with ResponseHandler
From: Duke DAI <duke.dai.007 () gmail ! com>
Date: 2019-03-21 13:19:39
Message-ID: CAPYoNwfwPLCF14qNMNjeus50hw0bQT0KKKMhsf85qszhmx2F2w () mail ! gmail ! com
[Download RAW message or body]
Finally, it proved to be an issue with glibc, similar with
https://issues.apache.org/jira/browse/HADOOP-7154.
After setting MALLOC_ARENA_MAX=4, native memory consumption got controlled.
Best regards,
Duke
If not now, when? If not me, who?
On Sun, Mar 17, 2019 at 10:02 PM Duke DAI <duke.dai.007@gmail.com> wrote:
> Hi Gurus,
>
> I'm struggling with native memory leak issue on my application. It works
> like a crawler, the only significant thirdparty is httpclient 4.5.6.
> pmap shows there are a lot of "anon" allocations but no hint where they
> come from. "anon" will become more and more along with the application
> running, slowly and gradually. It may be coincident with threads number
> spike.
>
> It's sure it's not a heap issue because gc.log only showed young GCs with
> G1GC, quite good performance with less than 100ms. There is NO mixed GC
> because young GC can collect most of garbages in heap, 98% of heap. I even
> suspected that G1GC young GC will never trigger the garbage collecting
> process in native memory(by DirectByteBuffer). Some articles say only full
> GC can trigger native memory garbage collecting, but they are talking about
> traditional GC algorithms, not G1GC. I'm not sure about the suspect.
>
> I tried below JVM options to limit native memory consumption, but there is
> no help. And jstat indicated there is no problem with Metaspace.
> -XX:MaxMetaspaceSize=512m -Djdk.nio.maxCachedBufferSize=5000000
>
> Before I try -XX:MaxDirectMemorySize(will try next), I inspected all code
> to make sure there is no leak from code level. When I read the code, it
> seems it does not handle IOException thrown by ResponseHandler. If
> IOException(SocketTimeOutException when reading the
> response.getEntity().getContent()) is hit in ResponseHandler, the framework
> only handles ClientProtocolException but not IOException, so the
> InputStream may get leaked there. Response.close will call
> socket.close(socket input/output stream), but I wonder if the intermediate
> DirectByteBuffer will be closed or not.
>
> Can some one shed a light here?
>
> @Override
> public <T> T execute(final HttpHost target, final HttpRequest request,
> final ResponseHandler<? extends T> responseHandler, final HttpContext context)
> throws IOException, ClientProtocolException {
> Args.notNull(responseHandler, "Response handler");
>
> final CloseableHttpResponse response = execute(target, request, context);
> try {
> final T result = responseHandler.handleResponse(response);
> final HttpEntity entity = response.getEntity();
> EntityUtils.consume(entity);
> return result;
> } catch (final ClientProtocolException t) {
> // Try to salvage the underlying connection in case of a protocol exception
> final HttpEntity entity = response.getEntity();
> try {
> EntityUtils.consume(entity);
> } catch (final Exception t2) {
> // Log this exception. The original exception is more
> // important and will be thrown to the caller.
> this.log.warn("Error consuming content after an exception.", t2);
> }
> throw t;
> } finally {
> response.close();
> }
> }
>
>
>
>
> Best regards,
> Duke
> If not now, when? If not me, who?
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic