Hi,

It is a known problem that 4.0.4 and EJB-3 leaks Hibernate lazy proxy classes 
generated by Javassist. The cache introduced in Javassist-3.4 (4.0.4 ships with 
Javassist-3.2) should solve the problem, but unfortunately doesn't. Probably 
because Hibernate uses a different MethodHandler for each new proxy and so you 
get a cache miss.

However it is possible to use Javassist-3.4 and supply a custom 
ClassLoaderProvider instance. It is important that this provide creates a new 
CL instance that just delegates. So the CL can be collected (and so can the 
proxy). Here is how to do that. The code can be put into a service mbean:


  |         ProxyFactory.useCache = false;
  |         ProxyFactory.classLoaderProvider = new ClassLoaderProvider() {
  |             public ClassLoader get(ProxyFactory pf) {
  |                 ClassLoader parent = getClassLoader(pf);
  |                 ClassLoader cl = new ClassLoader(parent) {
  |                     @Override
  |                     public Class loadClass(final String className) throws 
ClassNotFoundException {
  |                         try {
  |                             return super.loadClass(className);
  |                         } catch (ClassNotFoundException e) {
  |                             // only allow loading of ProxyObject from this 
loader
  |                             if 
(className.equals(ProxyObject.class.getName())) {
  |                                 return 
ProxyObject.class.getClassLoader().loadClass(className);
  |                             }
  |                             // was some other classname, throw the CNFE
  |                             throw e;
  |                         }
  |                     }
  |                 };
  |                 return cl;
  |             }
  |             
  |             private ClassLoader getClassLoader(ProxyFactory pf) {
  |                 Class superClass = pf.getSuperclass();
  |                 Class[] interfaces = pf.getInterfaces();
  |                 ClassLoader loader = null;
  |                 if (superClass != null && 
!superClass.getName().equals("java.lang.Object"))
  |                     loader = superClass.getClassLoader();
  |                 else if (interfaces != null && interfaces.length > 0)
  |                     loader = interfaces[0].getClassLoader();
  |          
  |                 if (loader == null) {
  |                     loader = getClass().getClassLoader();
  |                     // In case javassist is in the endorsed dir
  |                     if (loader == null) {
  |                         loader = 
Thread.currentThread().getContextClassLoader();
  |                         if (loader == null)
  |                             loader = ClassLoader.getSystemClassLoader();
  |                     }
  |                 }
  | 
  |                 return loader;
  |             }
  |             
  |         };
  | 

I don't know if this leak is fixed in later JBoss versions.

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4060417#4060417

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4060417
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to