You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2010/09/06 22:31:16 UTC

svn commit: r993145 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: component/ container/ proxy/ util/

Author: struberg
Date: Mon Sep  6 20:31:15 2010
New Revision: 993145

URL: http://svn.apache.org/viewvc?rev=993145&view=rev
Log:
OWB-445 fix mem leaks by using javassist proxy class cache

This also removes ProxyFactory#setHandler and moves the handler 
to the created proxy instances instead. 

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=993145&r1=993144&r2=993145&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java Mon Sep  6 20:31:15 2010
@@ -689,5 +689,6 @@ public abstract class AbstractOwbBean<T>
             }            
         }
     }
+
     
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java?rev=993145&r1=993144&r2=993145&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java Mon Sep  6 20:31:15 2010
@@ -24,6 +24,7 @@ import javassist.util.proxy.ProxyFactory
 
 import javax.enterprise.context.spi.CreationalContext;
 
+import javassist.util.proxy.ProxyObject;
 import org.apache.webbeans.corespi.ServiceLoader;
 import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.proxy.JavassistProxyFactory;
@@ -58,9 +59,9 @@ public class ResourceBean<X, T extends A
             
             ResourceInjectionService resourceService = ServiceLoader.getService(ResourceInjectionService.class);
             this.actualResourceReference = resourceService.getResourceReference(this.resourceReference);
-            proxyFactory.setHandler(new ResourceProxyHandler(this.actualResourceReference));
-            
+
             instance = (X)(JavassistProxyFactory.getInstance().getProxyClass(proxyFactory).newInstance());
+            ((ProxyObject)instance).setHandler(new ResourceProxyHandler(this.actualResourceReference));
         }
         catch (Exception e)
         {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=993145&r1=993144&r2=993145&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java Mon Sep  6 20:31:15 2010
@@ -76,6 +76,7 @@ import org.apache.webbeans.exception.inj
 import org.apache.webbeans.intercept.InterceptorComparator;
 import org.apache.webbeans.intercept.WebBeansInterceptorConfig;
 import org.apache.webbeans.intercept.webbeans.WebBeansInterceptor;
+import org.apache.webbeans.logger.WebBeansLogger;
 import org.apache.webbeans.plugins.OpenWebBeansJmsPlugin;
 import org.apache.webbeans.plugins.PluginLoader;
 import org.apache.webbeans.portable.AnnotatedElementFactory;
@@ -169,6 +170,8 @@ public class BeanManagerImpl implements 
 
     private AnnotatedElementFactory annotatedElementFactory;
 
+    private WebBeansLogger logger = WebBeansLogger.getLogger(BeanManagerImpl.class);
+
     /**
      * Creates a new {@link BeanManager} instance.
      * Called by the system. Do not use outside of the
@@ -797,19 +800,19 @@ public class BeanManagerImpl implements 
             if(instance != null)
             {
                 return instance;
-            }            
+            }
             
-            if(this.cacheProxies.containsKey(bean))
+            instance = cacheProxies.get(bean);
+
+            if (instance == null)
             {
-                return this.cacheProxies.get(bean);
+                //Create Managed Bean Proxy
+                instance = JavassistProxyFactory.getInstance().createNormalScopedBeanProxy((AbstractOwbBean<?>)bean,creationalContext);
+
+                //Cached instance
+                cacheProxies.put(bean, instance);
             }
-            
-            //Create Managed Bean Proxy
-            instance = JavassistProxyFactory.getInstance().createNormalScopedBeanProxy((AbstractOwbBean<?>)bean,creationalContext);
-            
-            //Cached instance
-            this.cacheProxies.put(bean, instance);
-            
+
         }
         //Create Pseudo-Scope Bean Instance
         else

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java?rev=993145&r1=993144&r2=993145&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java Mon Sep  6 20:31:15 2010
@@ -148,7 +148,10 @@ public final class JavassistProxyFactory
         {
             ProxyFactory fact = createProxyFactory(bean);
             AbstractDecoratorMethodHandler handler = new AbstractDecoratorMethodHandler();
+
+            //X TODO we MUST NOT set the handler here! This causes mem leaks!
             fact.setHandler(handler);
+            
             clazz = SecurityUtil.doPrivilegedCreateClass(fact);
         }
         catch(Exception e)
@@ -339,11 +342,6 @@ public final class JavassistProxyFactory
         ProxyFactory fact = new ProxyFactory();        
         fact.setInterfaces(interfaceArray);
         fact.setSuperclass(superClass);        
-
-        // turn off caching since this is utterly broken
-        // this is a static field, but we do not know who else
-        // might turn it on again ...
-        ProxyFactory.useCache = false;
         
         return fact;
         
@@ -358,10 +356,9 @@ public final class JavassistProxyFactory
             ProxyFactory pf = new ProxyFactory();
             pf.setInterfaces(new Class<?>[] { annotationType, Annotation.class });
             pf.setSuperclass(WebBeansAnnotation.class);
-            pf.setHandler(new WebBeansAnnotation(annotationType));
 
             result = (WebBeansAnnotation) pf.create(new Class[] { Class.class }, new Object[] { annotationType });
-
+            ((ProxyObject)result).setHandler(new WebBeansAnnotation(annotationType));
         }
         catch (Exception e)
         {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java?rev=993145&r1=993144&r2=993145&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java Mon Sep  6 20:31:15 2010
@@ -765,7 +765,10 @@ public final class WebBeansAnnotatedType
     {
         
         ManagedBean<T> bean = defineManagedBean(type);
+
+        //X TODO move proxy instance creation into JavassistProxyFactory!
         Class clazz = JavassistProxyFactory.getInstance().createAbstractDecoratorProxyClass(bean);
+
         bean.setConstructor(WebBeansUtil.defineConstructor(clazz));
         return bean;
     }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=993145&r1=993144&r2=993145&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Mon Sep  6 20:31:15 2010
@@ -2997,7 +2997,10 @@ public final class WebBeansUtil
     {
 
         ManagedBean<T> bean = defineManagedBean(managedBeanCreator, processInjectionTargetEvent);
+
+        //X TODO move proxy instance creation into JavassistProxyFactory!
         Class clazz = JavassistProxyFactory.getInstance().createAbstractDecoratorProxyClass(bean);
+
         bean.setConstructor(WebBeansUtil.defineConstructor(clazz));
         return bean;
     }