[httpclient] HTTP2: Memory Leak with Proxy
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