[JBoss-dev] CVS update: jbossmq/src/main/org/jboss/mq/server MessageCache.java MessageReference.java
User: pra Date: 02/02/17 09:55:08 Modified:src/main/org/jboss/mq/server MessageCache.java MessageReference.java Log: * Corrected several bugs in LRUCache and in usage of it. * Corrected thread locks. All access in both MessageCache and MessageReference now sync on MessageCache. Any changes to this must be tested on at least a dual CPU and with 100 000 messages or more, to be shure no threading locks are reintrioduced. Revision ChangesPath 1.16 +61 -26jbossmq/src/main/org/jboss/mq/server/MessageCache.java Index: MessageCache.java === RCS file: /cvsroot/jboss/jbossmq/src/main/org/jboss/mq/server/MessageCache.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- MessageCache.java 15 Feb 2002 20:59:53 - 1.15 +++ MessageCache.java 17 Feb 2002 17:55:08 - 1.16 @@ -4,7 +4,6 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ - package org.jboss.mq.server; import java.io.File; @@ -32,15 +31,14 @@ * * @author mailto:[EMAIL PROTECTED]";>Hiram Chirino * @author mailto:[EMAIL PROTECTED]";>David Maplesden - * @version$Revision: 1.15 $ + * @author mailto:[EMAIL PROTECTED]";>Peter Antman + * @version$Revision: 1.16 $ */ -public class MessageCache - extends ServiceMBeanSupport - implements MessageCacheMBean, MBeanRegistration, Runnable +public class MessageCache extends ServiceMBeanSupport implements MessageCacheMBean, MBeanRegistration, Runnable { // The cached messages are orded in a LRU linked list private LRUCache lruCache = new LRUCache(); - + // Provides a Unique ID to MessageHanles private long messageCounter = 0; int cacheHits = 0; @@ -72,18 +70,25 @@ */ public MessageReference add(SpyMessage message) throws javax.jms.JMSException { - log.trace("add lock aquire"); + boolean trace = log.isTraceEnabled(); + if (trace) + log.trace("add lock aquire"); + + MessageReference mh = null; synchronized (this) { - MessageReference mh = new MessageReference(); + mh = new MessageReference(); mh.init(this, messageCounter++, message); lruCache.addMostRecent(mh); totalCacheSize++; validateSoftReferenceDepth(); + + if(trace) +log.trace("add lock release"); - log.trace("add lock release"); - return mh; } + + return mh; } /** @@ -91,13 +96,19 @@ */ public void remove(MessageReference mr) throws JMSException { - log.trace("remove lock aquire"); + boolean trace = log.isTraceEnabled(); + if (trace) + log.trace("remove lock aquire"); + synchronized (this) { - mr.clear(); - lruCache.remove(mr); + mr.clear();//Will remove it from storage if soft + if (mr.hardReference != null)//If message is not hard, dont do lru stuff +lruCache.remove(mr); totalCacheSize--; - log.trace("remove lock release"); + + if (trace) +log.trace("remove lock release"); } } @@ -152,10 +163,16 @@ /** * This method is in charge of determining if it time to convert some * hard references over to soft references. +* +* It must NOT be called by a thread holding a lock on a reference wich +* in its turn holds a lock on cache. It WILL lead to deadlocks!!! */ public void validateSoftReferenceDepth() throws JMSException { - //log.trace("run lock aquire"); + boolean trace = log.isTraceEnabled(); + if (trace) + log.trace("run lock aquire"); + synchronized (this) { @@ -180,35 +197,42 @@ if (chnageCount > 1) { if (log.isDebugEnabled()) - log.debug("Converting " + chnageCount + " hard ref to to soft refs"); + log.debug("Converting " + chnageCount + " hard ref to to soft refs"); Node leastRecent = lruCache.getLeastRecent(); for (int i = 0; i < chnageCount && leastRecent != null; i++) { + // This is tricky, make soft should really be done outside + // sync on cache MessageReference mr = (MessageReference) leastRecent.data; mr.makeSoft(); - lruCache.remove(leastRecent); + lruCache.remove(mr); leastRecent = lruCache.getLeastRecent(); } } - //log.trace("run lock release"); + if (trace) +log.trace("run lock release");
[JBoss-dev] CVS update: jbossmq/src/main/org/jboss/mq/server MessageCache.java MessageCacheMBean.java StateManager.java StateManagerMBean.java
User: user57 Date: 02/02/12 20:26:38 Modified:src/main/org/jboss/mq/server MessageCache.java MessageCacheMBean.java StateManager.java StateManagerMBean.java Log: o These are all kinda related, so I am commiting them together o This is the second half of the migration to using ObjectName OBJECT_NAME o Not using jboss.system.* properties anywhere (one place in testsuite which I am ignoring for now) o StateManager will now read its config from a url (configURL), and only attempt to write it back out if that is a file URL. Need to fix this to not need to write back to a config file. o Still setting jboss.home & jboss.system.home, but use ServerConfigMBean to get the proper bits, will eventually abstract all file access out o Added a simple locator to find a mbean server. This is trivial code, but helps clean up client code and makes it obvious what it does. Revision ChangesPath 1.14 +5 -3 jbossmq/src/main/org/jboss/mq/server/MessageCache.java Index: MessageCache.java === RCS file: /cvsroot/jboss/jbossmq/src/main/org/jboss/mq/server/MessageCache.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- MessageCache.java 2 Feb 2002 03:54:21 - 1.13 +++ MessageCache.java 13 Feb 2002 04:26:38 - 1.14 @@ -4,6 +4,7 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ + package org.jboss.mq.server; import java.io.File; @@ -31,9 +32,11 @@ * * @author mailto:[EMAIL PROTECTED]";>Hiram Chirino * @author mailto:[EMAIL PROTECTED]";>David Maplesden - * @version$Revision: 1.13 $ + * @version$Revision: 1.14 $ */ -public class MessageCache extends ServiceMBeanSupport implements MessageCacheMBean, MBeanRegistration, Runnable +public class MessageCache + extends ServiceMBeanSupport + implements MessageCacheMBean, MBeanRegistration, Runnable { // The cached messages are orded in a LRU linked list private LRUCache lruCache = new LRUCache(); @@ -373,7 +376,6 @@ */ public void testBigLoad() throws Exception { - MessageCache cache = new MessageCache(); File tempDir = new File("Temp-" + System.currentTimeMillis()); tempDir.mkdirs(); 1.4 +36 -25jbossmq/src/main/org/jboss/mq/server/MessageCacheMBean.java Index: MessageCacheMBean.java === RCS file: /cvsroot/jboss/jbossmq/src/main/org/jboss/mq/server/MessageCacheMBean.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- MessageCacheMBean.java14 Nov 2001 04:23:27 - 1.3 +++ MessageCacheMBean.java13 Feb 2002 04:26:38 - 1.4 @@ -4,76 +4,87 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ + package org.jboss.mq.server; + import org.jboss.system.ServiceMBean; import javax.management.ObjectName; - + /** * Defines the managment interface that is exposed to the MessageCache * * @author mailto:[EMAIL PROTECTED]";>Hiram Chirino - * @version$Revision: 1.3 $ + * @version$Revision: 1.4 $ */ -public interface MessageCacheMBean extends ServiceMBean { - /** +public interface MessageCacheMBean + extends ServiceMBean +{ + /** * Gets the hardRefCacheSize +* * @return Returns a int */ - public int getHardRefCacheSize(); - + int getHardRefCacheSize(); + /** * Gets the softRefCacheSize +* * @return Returns a int */ - public int getSoftRefCacheSize(); - + int getSoftRefCacheSize(); + /** * Gets the totalCacheSize +* * @return Returns a int */ - public int getTotalCacheSize(); + int getTotalCacheSize(); - /** * Gets the cacheMisses +* * @return Returns a int */ - public int getCacheMisses(); - + int getCacheMisses(); + /** * Gets the cacheHits +* * @return Returns a int */ - public int getCacheHits(); + int getCacheHits(); /** * Gets the highMemoryMark +* * @return Returns a long */ - public long getHighMemoryMark(); - + long getHighMemoryMark(); + /** * Sets the highMemoryMark +* * @param highMemoryMark The highMemoryMark to set */ - public void setHighMemoryMark(long highMemoryMark); - + void setHighMemoryMark(long highMemoryMark); + /** * Gets the maxMemoryMark +* * @return Returns a long */ - public long getMaxMemoryMark(); - + long getMaxMemoryMark(); + /** * Set
[JBoss-dev] CVS update: jbossmq/src/main/org/jboss/mq/server MessageCache.java
User: ejort Date: 02/01/02 09:06:54 Modified:src/main/org/jboss/mq/server MessageCache.java Log: Removed some unguarded trace statements. Revision ChangesPath 1.11 +17 -9 jbossmq/src/main/org/jboss/mq/server/MessageCache.java Index: MessageCache.java === RCS file: /cvsroot/jboss/jbossmq/src/main/org/jboss/mq/server/MessageCache.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- MessageCache.java 2001/12/13 22:22:43 1.10 +++ MessageCache.java 2002/01/02 17:06:53 1.11 @@ -25,7 +25,7 @@ * * @author mailto:[EMAIL PROTECTED]";>Hiram Chirino * @author mailto:[EMAIL PROTECTED]";>David Maplesden - * @version$Revision: 1.10 $ + * @version$Revision: 1.11 $ */ public class MessageCache extends ServiceMBeanSupport implements MessageCacheMBean, MBeanRegistration, Runnable { @@ -63,7 +63,8 @@ */ public MessageReference add(SpyMessage message) throws javax.jms.JMSException { - log.trace("add lock aquire"); + if (log.isTraceEnabled()) +log.trace("add lock aquire"); synchronized (this) { MessageReference mh = new MessageReference(); @@ -72,7 +73,8 @@ totalCacheSize++; validateSoftReferenceDepth(); - log.trace("add lock release"); + if (log.isTraceEnabled()) + log.trace("add lock release"); return mh; } } @@ -82,13 +84,15 @@ */ public void remove(MessageReference mr) throws JMSException { - log.trace("remove lock aquire"); + if (log.isTraceEnabled()) +log.trace("remove lock aquire"); synchronized (this) { mr.clear(); lruCache.remove(mr); totalCacheSize--; - log.trace("remove lock release"); + if (log.isTraceEnabled()) + log.trace("remove lock release"); } } @@ -137,7 +141,8 @@ { // Signal to exit the thread. } - log.debug("Thread exiting."); + if (log.isDebugEnabled()) +log.debug("Thread exiting."); } /** @@ -170,7 +175,8 @@ // if the serverity is low since it will round up. if (chnageCount > 1) { -log.debug("Converting " + chnageCount + " hard ref to to soft refs"); +if (log.isDebugEnabled()) + log.debug("Converting " + chnageCount + " hard ref to to soft refs"); Node leastRecent = lruCache.getLeastRecent(); for (int i = 0; i < chnageCount && leastRecent != null; i++) { @@ -191,14 +197,16 @@ */ synchronized public void messageReferenceUsedEvent(MessageReference mh, boolean wasHard) { - log.trace("messageReferenceUsedEvent lock aquire"); + if (log.isTraceEnabled()) +log.trace("messageReferenceUsedEvent lock aquire"); synchronized (this) { if (wasHard) lruCache.makeMostRecent(mh); else lruCache.addMostRecent(mh); - log.trace("messageReferenceUsedEvent lock released"); + if (log.isTraceEnabled()) + log.trace("messageReferenceUsedEvent lock released"); } } ___ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development
[JBoss-dev] CVS update: jbossmq/src/main/org/jboss/mq/server MessageCache.java
User: dmaplesden Date: 01/12/11 19:24:58 Modified:src/main/org/jboss/mq/server MessageCache.java Log: Undo my object pooling code, it causes a number of bugs when server is under high load. Revision ChangesPath 1.9 +4 -28 jbossmq/src/main/org/jboss/mq/server/MessageCache.java Index: MessageCache.java === RCS file: /cvsroot/jboss/jbossmq/src/main/org/jboss/mq/server/MessageCache.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- MessageCache.java 2001/12/09 05:50:31 1.8 +++ MessageCache.java 2001/12/12 03:24:58 1.9 @@ -24,14 +24,10 @@ * later. * * @author mailto:[EMAIL PROTECTED]";>Hiram Chirino - * @version$Revision: 1.8 $ + * @version$Revision: 1.9 $ */ public class MessageCache extends ServiceMBeanSupport implements MessageCacheMBean, MBeanRegistration, Runnable { - //pool of message ref objects - public static final int MAX_POOL_SIZE = 100*1000; - protected ArrayList pool = new ArrayList(MAX_POOL_SIZE); - // The cached messages are orded in a LRU linked list private LinkedList lruCache = new LinkedList(); @@ -61,25 +57,6 @@ return this; } - //this method is only called from within synchronized block, so don't need to sync - protected MessageReference getMessageReference(MessageCache messageCache, Long referenceId, SpyMessage message) { - MessageReference ref = null; - if(!pool.isEmpty()) - ref = (MessageReference)pool.remove(pool.size()-1); - else - ref = new MessageReference(); - ref.init(messageCache,referenceId,message); - return ref; - } - - //this method is only called from within synchronized block, so don't need to sync - protected void releaseMessageReference(MessageReference ref){ - if(pool.size() < MAX_POOL_SIZE){ - ref.reset(); - pool.add(ref); - } - } - /** * Adds a message to the cache */ @@ -88,7 +65,8 @@ log.trace("add lock aquire"); synchronized (this) { - MessageReference mh = getMessageReference(this, new Long(messageCounter++), message); + MessageReference mh = new MessageReference(); + mh.init(this, new Long(messageCounter++), message); lruCache.addLast(mh); totalCacheSize++; validateSoftReferenceDepth(); @@ -108,7 +86,6 @@ { mr.clear(); lruCache.remove(mr); - releaseMessageReference(mr); totalCacheSize--; log.trace("remove lock release"); } @@ -443,5 +420,4 @@ public void setCacheStore(ObjectName cacheStore) { cacheStoreObjectName = cacheStore; } - -} + } ___ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development
[JBoss-dev] CVS update: jbossmq/src/main/org/jboss/mq/server MessageCache.java
User: chirino Date: 01/12/08 21:50:31 Modified:src/main/org/jboss/mq/server MessageCache.java Log: Reduced the verbosity of the logging. Was getting 4 lines in the logs per second even is nothing was happening. Revision ChangesPath 1.8 +10 -7 jbossmq/src/main/org/jboss/mq/server/MessageCache.java Index: MessageCache.java === RCS file: /cvsroot/jboss/jbossmq/src/main/org/jboss/mq/server/MessageCache.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- MessageCache.java 2001/11/14 04:23:27 1.7 +++ MessageCache.java 2001/12/09 05:50:31 1.8 @@ -24,7 +24,7 @@ * later. * * @author mailto:[EMAIL PROTECTED]";>Hiram Chirino - * @version$Revision: 1.7 $ + * @version$Revision: 1.8 $ */ public class MessageCache extends ServiceMBeanSupport implements MessageCacheMBean, MBeanRegistration, Runnable { @@ -132,9 +132,9 @@ { while (true) { -log.trace("Waiting for a reference to get GCed."); + // +//log.trace("Waiting for a reference to get GCed."); // Get the next soft reference that was canned by the GC - Reference r = referenceQueue.remove(1000); if (r != null) { @@ -145,9 +145,12 @@ { softRefCacheSize--; } + if( log.isTraceEnabled() ) + log.trace("soft reference cache size is now: "+softRefCacheSize); + + //log.trace("Validating soft reference count."); + validateSoftReferenceDepth(); } -log.trace("Validating soft reference count."); -validateSoftReferenceDepth(); } } catch (JMSException e) { @@ -165,7 +168,7 @@ */ public void validateSoftReferenceDepth() throws JMSException { - log.trace("run lock aquire"); + //log.trace("run lock aquire"); synchronized (this) { @@ -198,7 +201,7 @@ iter.remove(); } } - log.trace("run lock release"); + //log.trace("run lock release"); } } ___ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development
[JBoss-dev] CVS update: jbossmq/src/main/org/jboss/mq/server MessageCache.java MessageCacheMBean.java MessageReference.java
User: chirino Date: 01/11/13 20:23:27 Modified:src/main/org/jboss/mq/server MessageCache.java MessageCacheMBean.java MessageReference.java Log: Factored out a CacheStore object from the message store. This should lay the ground work needed so that the MessageCache can use a PM for saving and loading messages. Also fixed a small bug in the file PM. It was not properly restoring the message after a server restart. Revision ChangesPath 1.7 +25 -52jbossmq/src/main/org/jboss/mq/server/MessageCache.java Index: MessageCache.java === RCS file: /cvsroot/jboss/jbossmq/src/main/org/jboss/mq/server/MessageCache.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- MessageCache.java 2001/11/14 01:53:40 1.6 +++ MessageCache.java 2001/11/14 04:23:27 1.7 @@ -15,6 +15,7 @@ import org.jboss.system.ServiceMBeanSupport; import org.jboss.mq.SpyMessage; import javax.jms.JMSException; +import org.jboss.mq.pm.CacheStore; /** * This class implements a Message cache so that larger amounts of messages @@ -23,7 +24,7 @@ * later. * * @author mailto:[EMAIL PROTECTED]";>Hiram Chirino - * @version$Revision: 1.6 $ + * @version$Revision: 1.7 $ */ public class MessageCache extends ServiceMBeanSupport implements MessageCacheMBean, MBeanRegistration, Runnable { @@ -39,8 +40,9 @@ int cacheHits = 0; int cacheMisses = 0; - private File dataFile; - private String dataDirectory; + CacheStore cacheStore; + ObjectName cacheStoreObjectName; + private Thread referenceSoftner; private long highMemoryMark = 1024L * 1000 * 16; @@ -219,29 +221,20 @@ // // Perisitence methods used by the MessageReference. - // TODO: delegate this work to a PM. // - SpyMessage loadFromStorage(MessageReference mh) throws IOException, ClassNotFoundException + SpyMessage loadFromStorage(MessageReference mh) throws JMSException { - File f = new File(dataFile, "Message-" + mh.referenceId); - ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(new FileInputStream(f))); - Object rc = is.readObject(); - is.close(); - return (SpyMessage) rc; + return (SpyMessage)cacheStore.loadFromStorage(mh); } - void saveToStorage(MessageReference mh, SpyMessage message) throws IOException + void saveToStorage(MessageReference mh, SpyMessage message) throws JMSException { - File f = new File(dataFile, "Message-" + mh.referenceId); - ObjectOutputStream os = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(f))); - os.writeObject(message); - os.close(); + cacheStore.saveToStorage(mh, message); } - void removeFromStorage(MessageReference mh) throws IOException + void removeFromStorage(MessageReference mh) throws JMSException { - File f = new File(dataFile, "Message-" + mh.referenceId); - f.delete(); + cacheStore.removeFromStorage(mh); } // @@ -256,29 +249,15 @@ */ protected void startService() throws Exception { - File jbossHome = new File(System.getProperty("jboss.system.home")); - dataFile = new File(jbossHome, dataDirectory); - log.debug("Data directory set to: " + dataFile.getCanonicalPath()); - - dataFile.mkdirs(); - if (!dataFile.isDirectory()) - throw new Exception("The configured data directory is not valid: " + dataDirectory); - - // Clean out the directory of any previous files. - File files[] = dataFile.listFiles(); - log.debug("Removing " + files.length + " file(s) from: " + dataFile.getCanonicalPath()); - for (int i = 0; i < files.length; i++) - { - files[i].delete(); - } - + + cacheStore = (CacheStore)getServer().invoke(cacheStoreObjectName, "getInstance", new Object[] {}, new String[] {}); + if (getState() == ServiceMBeanSupport.STARTED) throw new Exception("Cannot be initialized from the current state"); referenceSoftner = new Thread(this, "JBossMQ Cache Reference Softner"); referenceSoftner.setDaemon(true); referenceSoftner.start(); - } /** @@ -293,22 +272,6 @@ referenceSoftner = null; } - /** -* Gets the dataDirectory -* @return Returns a String -*/ - public String getDataDirectory() - { - return dataDirectory; - } - /**
[JBoss-dev] CVS update: jbossmq/src/main/org/jboss/mq/server MessageCache.java
User: starksm Date: 01/10/30 17:51:10 Modified:src/main/org/jboss/mq/server MessageCache.java Log: Use the ServiceMBeanSupport.log to for logging and change the debug msgs to trace to avoid the excessive logging to server.log Revision ChangesPath 1.3 +173 -133 jbossmq/src/main/org/jboss/mq/server/MessageCache.java Index: MessageCache.java === RCS file: /cvsroot/jboss/jbossmq/src/main/org/jboss/mq/server/MessageCache.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- MessageCache.java 2001/10/28 04:07:36 1.2 +++ MessageCache.java 2001/10/31 01:51:10 1.3 @@ -23,342 +23,380 @@ * later. * * @author mailto:[EMAIL PROTECTED]";>Hiram Chirino - * @version$Revision: 1.2 $ + * @version$Revision: 1.3 $ */ -public class MessageCache extends ServiceMBeanSupport implements MessageCacheMBean, MBeanRegistration, Runnable { - - org.apache.log4j.Category cat = org.apache.log4j.Category.getInstance(MessageCache.class); - +public class MessageCache extends ServiceMBeanSupport implements MessageCacheMBean, MBeanRegistration, Runnable +{ // The cached messages are orded in a LRU linked list private LinkedList lruCache = new LinkedList(); - - // Provides a Unique ID to MessageHanles + + // Provides a Unique ID to MessageHanles private long messageCounter = 0; int cacheHits = 0; int cacheMisses = 0; - + private File dataFile; private String dataDirectory; private Thread referenceSoftner; - + private long highMemoryMark = 1024L * 1000 * 16; private long maxMemoryMark = 1024L * 1000 * 32; public static final long ONE_MEGABYTE = 1024L * 1000; - + int softRefCacheSize = 0; int totalCacheSize = 0; - + // Used to get notified when message are being deleted by GC ReferenceQueue referenceQueue = new ReferenceQueue(); - + /** * Adds a message to the cache */ - public MessageReference add(SpyMessage message) throws javax.jms.JMSException { - cat.debug("add lock aquire"); - synchronized (this) { + public MessageReference add(SpyMessage message) throws javax.jms.JMSException + { + log.trace("add lock aquire"); + synchronized (this) + { MessageReference mh = new MessageReference(this, new Long(messageCounter++), message); lruCache.addLast(mh); totalCacheSize++; validateSoftReferenceDepth(); - - cat.debug("add lock release"); + + log.trace("add lock release"); return mh; } } - + /** * removes a message from the cache */ - public void remove(MessageReference mr) throws JMSException { - cat.debug("remove lock aquire"); - synchronized (this) { + public void remove(MessageReference mr) throws JMSException + { + log.trace("remove lock aquire"); + synchronized (this) + { mr.clear(); lruCache.remove(mr); totalCacheSize--; - cat.debug("remove lock release"); + log.trace("remove lock release"); } } - + /** * The strategy is that we keep the most recently used messages as -* Hard references. Then we make the older ones soft references. Making +* Hard references. Then we make the older ones soft references. Making * something a soft reference stores it to disk so we need to avoid making * soft references if we can avoid it. But once it is made a soft reference does * not mean that it is removed from memory. Depending on how agressive the JVM's * GC is, it may stay around long enough for it to be used by a client doing a read, * saving us read from the file system. If memory gets tight the GC will remove -* the soft references. What we want to do is make sure there are at least some +* the soft references. What we want to do is make sure there are at least some * soft references available so that the GC can reclaim memory. * @see Runnable#run() */ - public void run() { - try { - while (true) { -cat.debug("Waiting for a reference to get GCed."); + public void run() + { + try + { + while (true) + { +log.trace("Waiting for a reference to get GCed."); // Get the next soft reference that was canned by the GC - + Reference r = referenceQueue.remove(1000); -if (r != null) { +if (r != null) +{ softRefCacheSize--; // the GC will free a set of messages together, so we poll them