Author: davsclaus Date: Wed Jan 5 17:32:37 2011 New Revision: 1055545 URL: http://svn.apache.org/viewvc?rev=1055545&view=rev Log: CAMEL-3500: Headers on message and properties on Exchange is now using string interning for Camel keys, to reduce memory consumption.
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java?rev=1055545&r1=1055544&r2=1055545&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java Wed Jan 5 17:32:37 2011 @@ -83,7 +83,9 @@ public final class DefaultExchange imple public Exchange copy() { DefaultExchange exchange = new DefaultExchange(this); - exchange.setProperties(safeCopy(getProperties())); + if (hasProperties()) { + exchange.setProperties(safeCopy(getProperties())); + } safeCopy(exchange.getIn(), getIn()); if (hasOut()) { safeCopy(exchange.getOut(), getOut()); @@ -111,16 +113,16 @@ public final class DefaultExchange imple public Object getProperty(String name) { if (hasProperties()) { + if (name.startsWith("Camel")) { + name = name.intern(); + } return properties.get(name); } return null; } public Object getProperty(String name, Object defaultValue) { - Object answer = null; - if (hasProperties()) { - answer = properties.get(name); - } + Object answer = getProperty(name); return answer != null ? answer : defaultValue; } @@ -149,6 +151,11 @@ public final class DefaultExchange imple } public void setProperty(String name, Object value) { + // use intern String for properties which is Camel* properties + // this reduces memory allocations needed for those common properties + if (name != null && name.startsWith("Camel")) { + name = name.intern(); + } if (value != null) { // avoid the NullPointException getProperties().put(name, value); Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java?rev=1055545&r1=1055544&r2=1055545&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java Wed Jan 5 17:32:37 2011 @@ -55,12 +55,12 @@ public class CaseInsensitiveMap extends public CaseInsensitiveMap(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); - originalKeys = new HashMap<String, String>(initialCapacity); + originalKeys = new HashMap<String, String>(initialCapacity, loadFactor); } public CaseInsensitiveMap(int initialCapacity) { super(initialCapacity); - originalKeys = new HashMap<String, String>(); + originalKeys = new HashMap<String, String>(initialCapacity); } @Override @@ -80,15 +80,32 @@ public class CaseInsensitiveMap extends // invalidate views as we mutate entrySetView = null; String s = assembleKey(key); - originalKeys.put(s, key); + if (key.startsWith("Camel")) { + // use intern String for headers which is Camel* headers + // this reduces memory allocations needed for those common headers + originalKeys.put(s, key.intern()); + } else { + originalKeys.put(s, key); + } return super.put(s, value); } @Override public synchronized void putAll(Map<? extends String, ?> map) { + entrySetView = null; if (map != null && !map.isEmpty()) { for (Map.Entry<? extends String, ?> entry : map.entrySet()) { - put(entry.getKey(), entry.getValue()); + String key = entry.getKey(); + Object value = entry.getValue(); + String s = assembleKey(key); + if (key.startsWith("Camel")) { + // use intern String for headers which is Camel* headers + // this reduces memory allocations needed for those common headers + originalKeys.put(s, key.intern()); + } else { + originalKeys.put(s, key); + } + super.put(s, value); } } }