From 0579b1408d8dae4d85089fba5f1c8c14e04d1b61 Mon Sep 17 00:00:00 2001 From: Martin Ritchie Date: Tue, 17 Jul 2007 11:38:10 +0000 Subject: QPID-541 A large portion of memory was being wasted in 32k ByteBuffers being held by the AMQShortStrings. Patch submitted by Robert Godfrey to intern() the AMQSSs to reduce memory usage. Current implementation *will* impact performance due to the usage of a static Map for storage. However, a thread local implementation is in the works. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/branches/M2@556890 13f79535-47bb-0310-9956-ffa450edef68 --- .../server/handler/BasicConsumeMethodHandler.java | 18 ++++++++---- .../server/handler/BasicPublishMethodHandler.java | 10 +++++++ .../server/handler/ExchangeDeclareHandler.java | 4 ++- .../qpid/server/handler/QueueBindHandler.java | 6 ++++ .../qpid/server/handler/QueueDeclareHandler.java | 7 +++++ .../org/apache/qpid/framing/AMQShortString.java | 32 +++++++++++++++++++++- 6 files changed, 69 insertions(+), 8 deletions(-) (limited to 'java') diff --git a/java/broker/src/main/java/org/apache/qpid/server/handler/BasicConsumeMethodHandler.java b/java/broker/src/main/java/org/apache/qpid/server/handler/BasicConsumeMethodHandler.java index 56eae279dc..d1e4ae6aa6 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/handler/BasicConsumeMethodHandler.java +++ b/java/broker/src/main/java/org/apache/qpid/server/handler/BasicConsumeMethodHandler.java @@ -98,6 +98,12 @@ public class BasicConsumeMethodHandler implements StateAwareMethodListener { throw body.getChannelException(AMQConstant.NOT_FOUND, "Exchange " + body.exchange + " does not exist."); } + + if (body.routingKey != null) + { + body.routingKey = body.routingKey.intern(); + } + try { if (!exch.isBound(body.routingKey, body.arguments, queue)) diff --git a/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java b/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java index 2e697d4564..2bc185cfb4 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java +++ b/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java @@ -91,8 +91,15 @@ public class QueueDeclareHandler implements StateAwareMethodListener { + + private static final Map> internMap = + new WeakHashMap>(); + private static final Logger _logger = LoggerFactory.getLogger(AMQShortString.class); private final ByteBuffer _data; @@ -43,7 +51,6 @@ public final class AMQShortString implements CharSequence, Comparable ref = internMap.get(this); + if(ref != null) + { + AMQShortString internString = ref.get(); + if(internString != null) + { + return internString; + } + } + + AMQShortString internString = new AMQShortString(getBytes()); + internMap.put(internString, new WeakReference(internString)); + return internString; + } + } } -- cgit v1.2.1