Author: davsclaus
Date: Fri Oct  5 07:03:59 2012
New Revision: 1394386

URL: http://svn.apache.org/viewvc?rev=1394386&view=rev
Log:
CAMEL-5675: Using a LRUWeakCache instead of soft to reclaim the cache eager as 
we dont want to keep the cache around, and cause classloader unload issues as 
we store references to Class and Method in the cache.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUWeakCache.java
      - copied, changed from r1394362, 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/management/MBeanInfoAssembler.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java
    camel/trunk/camel-core/src/test/resources/log4j.properties

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/management/MBeanInfoAssembler.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/MBeanInfoAssembler.java?rev=1394386&r1=1394385&r2=1394386&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/management/MBeanInfoAssembler.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/management/MBeanInfoAssembler.java
 Fri Oct  5 07:03:59 2012
@@ -37,7 +37,8 @@ import org.apache.camel.api.management.M
 import org.apache.camel.api.management.ManagedOperation;
 import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.util.IntrospectionSupport;
-import org.apache.camel.util.LRUSoftCache;
+import org.apache.camel.util.LRUCache;
+import org.apache.camel.util.LRUWeakCache;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,7 +53,9 @@ public class MBeanInfoAssembler implemen
     private static final Logger LOG = 
LoggerFactory.getLogger(MBeanInfoAssembler.class);
 
     // use a cache to speedup gathering JMX MBeanInfo for known classes
-    private final Map<Class<?>, MBeanAttributesAndOperations> cache = new 
LRUSoftCache<Class<?>, MBeanAttributesAndOperations>(1000);
+    // use a weak cache as we dont want the cache to keep around as it 
reference classes
+    // which could prevent classloader to unload classes if being referenced 
from this cache
+    private final LRUCache<Class<?>, MBeanAttributesAndOperations> cache = new 
LRUWeakCache<Class<?>, MBeanAttributesAndOperations>(1000);
 
     @Override
     public void start() throws Exception {
@@ -61,6 +64,9 @@ public class MBeanInfoAssembler implemen
 
     @Override
     public void stop() throws Exception {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Clearing cache[size={}, hits={}, misses={}]", new 
Object[]{cache.size(), cache.getHits(), cache.getMisses()});
+        }
         cache.clear();
     }
 

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java?rev=1394386&r1=1394385&r2=1394386&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/IntrospectionSupport.java
 Fri Oct  5 07:03:59 2012
@@ -56,7 +56,10 @@ public final class IntrospectionSupport 
     private static final Pattern GETTER_PATTERN = 
Pattern.compile("(get|is)[A-Z].*");
     private static final Pattern SETTER_PATTERN = 
Pattern.compile("set[A-Z].*");
     private static final List<Method> EXCLUDED_METHODS = new 
ArrayList<Method>();
-    private static final Map<Class<?>, ClassInfo> CACHE = new 
LRUSoftCache<Class<?>, ClassInfo>(1000);
+    // use a cache to speedup introspecting for known classes during startup
+    // use a weak cache as we dont want the cache to keep around as it 
reference classes
+    // which could prevent classloader to unload classes if being referenced 
from this cache
+    private static final LRUCache<Class<?>, ClassInfo> CACHE = new 
LRUWeakCache<Class<?>, ClassInfo>(1000);
 
     static {
         // exclude all java.lang.Object methods as we dont want to invoke them
@@ -96,6 +99,9 @@ public final class IntrospectionSupport 
      * This implementation will clear its introspection cache.
      */
     public static void stop() {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Clearing cache[size={}, hits={}, misses={}]", new 
Object[]{CACHE.size(), CACHE.getHits(), CACHE.getMisses()});
+        }
         CACHE.clear();
     }
 

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java?rev=1394386&r1=1394385&r2=1394386&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java 
Fri Oct  5 07:03:59 2012
@@ -48,6 +48,7 @@ import java.util.Set;
  * for the existence of a value without catering for the soft references.
  *
  * @see LRUCache
+ * @see LRUWeakCache
  */
 public class LRUSoftCache<K, V> extends LRUCache<K, V> {
     private static final long serialVersionUID = 1L;

Copied: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUWeakCache.java 
(from r1394362, 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUWeakCache.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUWeakCache.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java&r1=1394362&r2=1394386&rev=1394386&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUSoftCache.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/LRUWeakCache.java 
Fri Oct  5 07:03:59 2012
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.util;
 
-import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashSet;
@@ -24,10 +24,10 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * A Least Recently Used Cache which uses {@link SoftReference}.
+ * A Least Recently Used Cache which uses {@link java.lang.ref.WeakReference}.
  * <p/>
- * This implementation uses {@link java.lang.ref.SoftReference} for stored 
values in the cache, to support the JVM
- * when it wants to reclaim objects when it's running out of memory. Therefore 
this implementation does
+ * This implementation uses {@link java.lang.ref.WeakReference} for stored 
values in the cache, to support the JVM
+ * when it wants to reclaim objects for example during garbage collection. 
Therefore this implementation does
  * not support <b>all</b> the {@link java.util.Map} methods.
  * <p/>
  * The following methods is <b>only</b> be be used:
@@ -48,36 +48,37 @@ import java.util.Set;
  * for the existence of a value without catering for the soft references.
  *
  * @see LRUCache
+ * @see LRUSoftCache
  */
-public class LRUSoftCache<K, V> extends LRUCache<K, V> {
+public class LRUWeakCache<K, V> extends LRUCache<K, V> {
     private static final long serialVersionUID = 1L;
 
-    public LRUSoftCache(int maximumCacheSize) {
+    public LRUWeakCache(int maximumCacheSize) {
         super(maximumCacheSize);
     }
 
-    public LRUSoftCache(int initialCapacity, int maximumCacheSize) {
+    public LRUWeakCache(int initialCapacity, int maximumCacheSize) {
         super(initialCapacity, maximumCacheSize);
     }
 
     @Override
     @SuppressWarnings("unchecked")
     public V put(K key, V value) {
-        SoftReference<V> put = new SoftReference<V>(value);
-        SoftReference<V> prev = (SoftReference<V>) super.put(key, (V) put);
+        WeakReference<V> put = new WeakReference<V>(value);
+        WeakReference<V> prev = (WeakReference<V>) super.put(key, (V) put);
         return prev != null ? prev.get() : null;
     }
 
     @Override
     @SuppressWarnings("unchecked")
     public V get(Object o) {
-        SoftReference<V> ref = (SoftReference<V>) super.get(o);
+        WeakReference<V> ref = (WeakReference<V>) super.get(o);
         return ref != null ? ref.get() : null;
     }
 
     @Override
     public void putAll(Map<? extends K, ? extends V> map) {
-        for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
+        for (Entry<? extends K, ? extends V> entry : map.entrySet()) {
             put(entry.getKey(), entry.getValue());
         }
     }
@@ -85,7 +86,7 @@ public class LRUSoftCache<K, V> extends 
     @Override
     @SuppressWarnings("unchecked")
     public V remove(Object o) {
-        SoftReference<V> ref = (SoftReference<V>) super.remove(o);
+        WeakReference<V> ref = (WeakReference<V>) super.remove(o);
         return ref != null ? ref.get() : null;
     }
 
@@ -93,9 +94,9 @@ public class LRUSoftCache<K, V> extends 
     @SuppressWarnings("unchecked")
     public Collection<V> values() {
         // return a copy of all the active values
-        Collection<SoftReference<V>> col = (Collection<SoftReference<V>>) 
super.values();
+        Collection<WeakReference<V>> col = (Collection<WeakReference<V>>) 
super.values();
         Collection<V> answer = new ArrayList<V>();
-        for (SoftReference<V> ref : col) {
+        for (WeakReference<V> ref : col) {
             V value = ref.get();
             if (value != null) {
                 answer.add(value);
@@ -109,7 +110,7 @@ public class LRUSoftCache<K, V> extends 
         // only count as a size if there is a value
         int size = 0;
         for (V value : super.values()) {
-            SoftReference<?> ref = (SoftReference<?>) value;
+            WeakReference<?> ref = (WeakReference<?>) value;
             if (ref != null && ref.get() != null) {
                 size++;
             }
@@ -130,15 +131,15 @@ public class LRUSoftCache<K, V> extends 
     }
 
     @Override
-    public Set<Map.Entry<K, V>> entrySet() {
-        Set<Map.Entry<K, V>> original = super.entrySet();
+    public Set<Entry<K, V>> entrySet() {
+        Set<Entry<K, V>> original = super.entrySet();
 
         // must use a copy to avoid concurrent modifications and be able to 
get/set value using
         // the soft reference so the returned set is without the soft 
reference, and thus is
         // use able for the caller to use
-        Set<Map.Entry<K, V>> answer = new LinkedHashSet<Map.Entry<K, 
V>>(original.size());
-        for (final Map.Entry<K, V> entry : original) {
-            Map.Entry<K, V> view = new Map.Entry<K, V>() {
+        Set<Entry<K, V>> answer = new LinkedHashSet<Entry<K, 
V>>(original.size());
+        for (final Entry<K, V> entry : original) {
+            Entry<K, V> view = new Entry<K, V>() {
                 @Override
                 public K getKey() {
                     return entry.getKey();
@@ -147,15 +148,15 @@ public class LRUSoftCache<K, V> extends 
                 @Override
                 @SuppressWarnings("unchecked")
                 public V getValue() {
-                    SoftReference<V> ref = (SoftReference<V>) entry.getValue();
+                    WeakReference<V> ref = (WeakReference<V>) entry.getValue();
                     return ref != null ? ref.get() : null;
                 }
 
                 @Override
                 @SuppressWarnings("unchecked")
                 public V setValue(V v) {
-                    V put = (V) new SoftReference<V>(v);
-                    SoftReference<V> prev = (SoftReference<V>) 
entry.setValue(put);
+                    V put = (V) new WeakReference<V>(v);
+                    WeakReference<V> prev = (WeakReference<V>) 
entry.setValue(put);
                     return prev != null ? prev.get() : null;
                 }
             };
@@ -167,6 +168,6 @@ public class LRUSoftCache<K, V> extends 
 
     @Override
     public String toString() {
-        return "LRUSoftCache@" + ObjectHelper.getIdentityHashCode(this);
+        return "LRUWeakCache@" + ObjectHelper.getIdentityHashCode(this);
     }
 }
\ No newline at end of file

Modified: camel/trunk/camel-core/src/test/resources/log4j.properties
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/resources/log4j.properties?rev=1394386&r1=1394385&r2=1394386&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/resources/log4j.properties (original)
+++ camel/trunk/camel-core/src/test/resources/log4j.properties Fri Oct  5 
07:03:59 2012
@@ -21,7 +21,7 @@
 log4j.rootLogger=INFO, file
 
 #log4j.logger.org.apache.camel.impl.converter=WARN
-log4j.logger.org.apache.camel.management=WARN
+#log4j.logger.org.apache.camel.management=WARN
 log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
 #log4j.logger.org.apache.camel.impl.converter.DefaultTypeConverter=TRACE
 #log4j.logger.org.apache.camel.impl.converter=DEBUG


Reply via email to