From 27a2017f7f5db2707b21600c2d976afbc7b57cfd Mon Sep 17 00:00:00 2001 From: Scott Mitchell Date: Wed, 21 Jan 2015 13:40:09 -0500 Subject: [PATCH] Opportunity for lazy initialization in Headers interface Motivation: The Headers interface had two member variables (addAllVisitor, setAllVisitor) which are not necessarily always needed but are always instantiated. This may result in excess memory being used. Modifications: - addAllVisitor will be accessed via a method addAllVisitor() which will use lazy initialization. - setAllVisitor will be accessed via a method addAllVisitor() which will use lazy initialization. Result: Potential memory savings by using lazy initialization. --- .../netty/handler/codec/DefaultHeaders.java | 55 ++++++++++++------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/codec/src/main/java/io/netty/handler/codec/DefaultHeaders.java b/codec/src/main/java/io/netty/handler/codec/DefaultHeaders.java index 206e481354..7605f3f340 100644 --- a/codec/src/main/java/io/netty/handler/codec/DefaultHeaders.java +++ b/codec/src/main/java/io/netty/handler/codec/DefaultHeaders.java @@ -79,25 +79,8 @@ public class DefaultHeaders implements Headers { private static final int HASH_CODE_PRIME = 31; private static final int DEFAULT_BUCKET_SIZE = 17; private static final int DEFAULT_MAP_SIZE = 4; - private static final NameConverter DEFAULT_NAME_CONVERTER = new IdentityNameConverter(); - private final EntryVisitor setAllVisitor = new EntryVisitor() { - @Override - public boolean visit(Entry entry) { - set(entry.getKey(), entry.getValue()); - return true; - } - }; - - private final EntryVisitor addAllVisitor = new EntryVisitor() { - @Override - public boolean visit(Entry entry) { - add(entry.getKey(), entry.getValue()); - return true; - } - }; - private final IntObjectMap entries; private final IntObjectMap tailEntries; private final HeaderEntry head; @@ -107,6 +90,8 @@ public class DefaultHeaders implements Headers { private final ValueConverter valueConverter; private final NameConverter nameConverter; private final int bucketSize; + private EntryVisitor setAllVisitor; + private EntryVisitor addAllVisitor; int size; @SuppressWarnings("unchecked") @@ -752,7 +737,7 @@ public class DefaultHeaders implements Headers { } } else { try { - headers.forEachEntry(setAllVisitor); + headers.forEachEntry(setAllVisitor()); } catch (Exception ex) { PlatformDependent.throwException(ex); } @@ -1255,7 +1240,7 @@ public class DefaultHeaders implements Headers { } } else { try { - headers.forEachEntry(addAllVisitor); + headers.forEachEntry(addAllVisitor()); } catch (Exception ex) { PlatformDependent.throwException(ex); } @@ -1322,6 +1307,38 @@ public class DefaultHeaders implements Headers { return removed; } + /** + * Lazy initialization of the visitor which will set all headers. + */ + private EntryVisitor setAllVisitor() { + if (setAllVisitor == null) { + setAllVisitor = new EntryVisitor() { + @Override + public boolean visit(Entry entry) { + set(entry.getKey(), entry.getValue()); + return true; + } + }; + } + return setAllVisitor; + } + + /** + * Lazy initialization of the visitor which will add all headers. + */ + private EntryVisitor addAllVisitor() { + if (addAllVisitor == null) { + addAllVisitor = new EntryVisitor() { + @Override + public boolean visit(Entry entry) { + add(entry.getKey(), entry.getValue()); + return true; + } + }; + } + return addAllVisitor; + } + private final class HeaderEntry implements Map.Entry { final int hash; final T name;