> 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).

Ashay Rane has updated the pull request incrementally with one additional 
commit since the last revision:

  Address PR comments
  
  1. Mark newly-introduced package private functions (`getConnections()`
     and `getCachedHeaderBuffer()`) so that it's clear that they're used
     only by the tests.
  
  2. Early return in `getHeaderBuffer()` when `cachedHeaderBuffer` is
     newly allocated, thus skipping the `clear()` and `limit()` calls.

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/30931/files
  - new: https://git.openjdk.org/jdk/pull/30931/files/9766ec25..e478ced6

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=30931&range=04
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=30931&range=03-04

  Stats: 5 lines in 2 files changed: 5 ins; 0 del; 0 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