Prior to this patch, every HTTP request created a new 16KB buffer for
encoding the header, which is typically only a few hundred bytes long.
This increased pressure on the garbage collector when the client created
lots of requests.  This patch instead makes the header encoder reuse the
buffer that is created during the handling of the first request.

The caveat, however, is that the downstream consumers of the header are
asynchronous, so the encoder needs to take special care to ensure that
it doesn't modify or invalidate the buffer after it hands the buffer
over to the downstream asynchronous pipeline.  To resolve this, this
patch snapshots the buffer data into compact copies sized to the actual
encoded length.  Doing so makes the buffer immediately available for
reuse via `clear()` and `limit()`.

For typical requests, this reduces per-request allocation from 16KB to
a few hundred bytes (i.e. the size of the compact copy of the encoded
headers), with the 16KB encoding buffer allocated once per connection
instead of once per request.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - Reuse buffer for encoding headers instead of allocating one per request

Changes: https://git.openjdk.org/jdk/pull/30931/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=30931&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8383248
  Stats: 142 lines in 2 files changed: 132 ins; 2 del; 8 mod
  Patch: https://git.openjdk.org/jdk/pull/30931.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/30931/head:pull/30931

PR: https://git.openjdk.org/jdk/pull/30931

Reply via email to