From ac8ac591488b976aba5ebe7a1bbfb24f5e1ecc09 Mon Sep 17 00:00:00 2001 From: Brendt Lucas Date: Tue, 8 Jul 2014 18:31:37 +0100 Subject: [PATCH] [#2642] CompositeByteBuf.deallocate memory/GC improvement Motivation: CompositeByteBuf.deallocate generates unnecessary GC pressure when using the 'foreach' loop, as a 'foreach' loop creates an iterator when looping. Modification: Convert 'foreach' loop into regular 'for' loop. Result: Less GC pressure (and possibly more throughput) as the 'for' loop does not create an iterator --- buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java b/buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java index 818c97569f..d5cf14c27d 100644 --- a/buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/CompositeByteBuf.java @@ -1599,8 +1599,11 @@ public class CompositeByteBuf extends AbstractReferenceCountedByteBuf { } freed = true; - for (Component c: components) { - c.freeIfNecessary(); + int size = components.size(); + // We're not using foreach to avoid creating an iterator. + // see https://github.com/netty/netty/issues/2642 + for (int i = 0; i < size; i++) { + components.get(i).freeIfNecessary(); } if (leak != null) {