[httpclient] HTTP2: Memory Leak with Proxy (original) (raw)

Albert Schimpf albi646 at gmx.de
Sun Aug 5 19:54:12 UTC 2018


Hi,

I stumbled upon some strange behavior when using the new Java httpclient.

The issue is very simple to reproduce. Send a GET request via a known bad proxy:

HttpClient client = HttpClient.newBuilder()                     .proxy(ProxySelector.of(BAD_PROXY))                     .build();

HttpRequest req = HttpRequest                     // target is not relevant                     .newBuilder(...)                     .GET()                     .build();

// body handler is not relevant HttpResponse.BodyHandler<?> t = HttpResponse.BodyHandler.asString();

// happens with both async and sync send client.sendAsync(req, t).get(30, TimeUnit.SECONDS);

The result is that the heap size increases dramatically (to about 1.5GB) and resources are not released. CPU consumption increases by a constant factor, too. I have tried many variations of the above code, and the only thing which seems to work (i.e. heap size does not explode) is to set the HTTP version to 1.1.

In my main application this leads to both memory and CPU starvation (4GB memory limit, 100% CPU usage). It usually uses only 5% CPU and 200MB memory at worst.

I have attached a working example code with a bad proxy. I uploaded the generated garbage collection log and three heap dumps (before, during, and after the request) to dropbox:

https://www.dropbox.com/s/ulqnmrmgr58rrul/debug.zip

I tried the 10.0.0-openjdk and 10.0.1-zulu version. I can reproduce the issue 100% of times.

Am I doing something wrong? Is this to be expected if one somehow happens to use a bad proxy? If this is to be expected, how can I protect my application against such behavior?

Best,

Albert



More information about the core-libs-dev mailing list