From bda623efec084d9d8bcc3359aa4f1d91efc2061f Mon Sep 17 00:00:00 2001 From: Baoyi Chen Date: Thu, 29 Oct 2020 11:28:38 +0800 Subject: [PATCH] Fix issue #5499 this PR let the ByteAccumulator recyclable. after invoke ByteAccumulator.transferTo method we can invoke ByteAccumulator.recycle method to reuse byte[] via ByteAccumulator.newByteArray method Signed-off-by: Baoyi Chen --- .../common/extensions/compress/ByteAccumulator.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/compress/ByteAccumulator.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/compress/ByteAccumulator.java index 02bd0c8821e1..fdd6f28ba9ce 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/compress/ByteAccumulator.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/compress/ByteAccumulator.java @@ -103,7 +103,18 @@ void recycle() { index = 0; length = 0; - prevChunks = nextChunks; + + int resize = 16; + if (prevChunks == null || nextChunks.size() > prevChunks.size()) + { + prevChunks = nextChunks; + } + + // keep prevChunks retain max resize elements + if (prevChunks.size() > resize) + { + prevChunks.subList(resize, prevChunks.size()).clear(); + } nextChunks = new ArrayList<>(); } }