Hi, I've profiled the memory allocation during load testing HTTP2: https://pasteboard.co/Jtblqfl.png
As you can see there are a lot of ByteBuffer.allocate(int) calls. org.apache.catalina.connector.Response#Response(int) org.apache.catalina.connector.Request#inputBuffer org.apache.coyote.http2.Http2AsyncParser#readFrame org.apache.coyote.http2.Stream.StreamOutputBuffer#buffer Has it been discussed in the past to use a pool of ByteBuffer instances ? Netty provides such for its abstraction ByteBuf: https://netty.io/wiki/using-as-a-generic-library.html Here is a simple implementation: https://github.com/jhg023/Pbbl/blob/39c749b9e65f4f8a840a07812559cf8830bd5eae/src/main/java/com/github/pbbl/AbstractBufferPool.java#L44 It's give() method could be optimized to not return the buffer to the pool if the pool size is bigger than N, so it doesn't use huge list of buffers which are used just once. The big unknown to me is: where to return the buffers to the pool ? For HTTP2 maybe this could be done after writing the buffer to the socket. If the Request/Response is recycled then their Input/OutputBuffer are reused and everything is OK. But if recycling is not in use then new allocations are done for each new request. I see that org.apache.tomcat.util.net.WriteBuffer does some pooling already. What do you think? Martin