[Mc4j-cvs] SF.net SVN: mc4j: [589] trunk/mc4j/modules/ems
Brought to you by:
ghinkl
From: <gh...@us...> - 2008-04-10 19:52:19
|
Revision: 589 http://mc4j.svn.sourceforge.net/mc4j/?rev=589&view=rev Author: ghinkl Date: 2008-04-10 12:52:05 -0700 (Thu, 10 Apr 2008) Log Message: ----------- Some fixes for leaks in connection management and elsewhere Cache classloaders with weak references to reduce class loading when checking connections on down servers Modified Paths: -------------- trunk/mc4j/modules/ems/build.xml trunk/mc4j/modules/ems/src/ems/org/mc4j/ems/connection/support/classloader/ChildFirstClassloader.java trunk/mc4j/modules/ems/src/ems/org/mc4j/ems/connection/support/classloader/ClassLoaderFactory.java trunk/mc4j/modules/ems/src/ems-impl/org/mc4j/ems/impl/jmx/connection/bean/DMBean.java trunk/mc4j/modules/ems/src/ems-impl/org/mc4j/ems/impl/jmx/connection/bean/operation/DOperation.java Modified: trunk/mc4j/modules/ems/build.xml =================================================================== --- trunk/mc4j/modules/ems/build.xml 2008-04-10 19:09:32 UTC (rev 588) +++ trunk/mc4j/modules/ems/build.xml 2008-04-10 19:52:05 UTC (rev 589) @@ -30,7 +30,7 @@ <property name="module.jar" value="org-mc4j-ems.jar"/> - <property name="release.version" value="1.2.0"/> + <property name="release.version" value="1.2.2"/> <target Modified: trunk/mc4j/modules/ems/src/ems/org/mc4j/ems/connection/support/classloader/ChildFirstClassloader.java =================================================================== --- trunk/mc4j/modules/ems/src/ems/org/mc4j/ems/connection/support/classloader/ChildFirstClassloader.java 2008-04-10 19:09:32 UTC (rev 588) +++ trunk/mc4j/modules/ems/src/ems/org/mc4j/ems/connection/support/classloader/ChildFirstClassloader.java 2008-04-10 19:52:05 UTC (rev 589) @@ -38,7 +38,8 @@ throws ClassNotFoundException { Class c = findLoadedClass(name); if (c == null) { - if (name.indexOf("org.mc4j") == -1) { //true) {//name.indexOf("javax.management") >= 0) { + if (name.indexOf("org.mc4j") == -1 || + name.indexOf("org.apache.commons.logging") == -1) { //true) {//name.indexOf("javax.management") >= 0) { // if (name.contains("log4j.xml")) // System.out.println("Looking for " + name); try { Modified: trunk/mc4j/modules/ems/src/ems/org/mc4j/ems/connection/support/classloader/ClassLoaderFactory.java =================================================================== --- trunk/mc4j/modules/ems/src/ems/org/mc4j/ems/connection/support/classloader/ClassLoaderFactory.java 2008-04-10 19:09:32 UTC (rev 588) +++ trunk/mc4j/modules/ems/src/ems/org/mc4j/ems/connection/support/classloader/ClassLoaderFactory.java 2008-04-10 19:52:05 UTC (rev 589) @@ -34,11 +34,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.lang.ref.WeakReference; /** * @author Greg Hinkle (gh...@us...), Apr 5, 2005 @@ -54,6 +51,8 @@ private static Map<FileKey, File> tempJarCache = Collections.synchronizedMap(new HashMap<FileKey, File>()); + private static Map<Long, WeakReference<ClassLoader>> classLoaderCache = Collections.synchronizedMap(new HashMap<Long, WeakReference<ClassLoader>>()); + static { String className = System.getProperty("org.mc4j.ems.classloaderfactory"); if (className != null) { @@ -198,7 +197,6 @@ } } - // Now load in the implementation jar // URL implURL = new URL(null, "deepjar://org-mc4j-ems-impl.jar", new Handler()); URL implURL = storeImplToTemp("org-mc4j-ems-impl.jar", tempDir); @@ -241,24 +239,37 @@ // TODO: Check if file exists, log warning if not URL[] entryArray = entries.toArray(new URL[entries.size()]); + ClassLoader loader = null; - // WARNING: Relatively disgusting hack. hiding classes is not a good thing - URLClassLoader loader = null; - if (settings.getConnectionType().isUseChildFirstClassLoader()) { - loader = new ChildFirstClassloader(entryArray, ClassLoaderFactory.class.getClassLoader()); - } else { - // TODO was NestedJarClassLoader - //loader = new ChildFirstClassloader(entryArray, ClassLoaderFactory.class.getClassLoader()); - loader = new URLClassLoader(entryArray, ClassLoaderFactory.class.getClassLoader()); - //loader = new NestedJarClassLoader(entryArray, ClassLoaderFactory.class.getClassLoader()); + long key = Arrays.hashCode(entryArray); + + WeakReference<ClassLoader> loaderReference = classLoaderCache.get(key); + if (loaderReference != null) { + loader = classLoaderCache.get(key).get(); } + + if (loader == null) { - if (log.isDebugEnabled()) { - StringBuffer buf = new StringBuffer("Classloader built with: \n"); - for (URL url : entries) { - buf.append("\t").append(url).append("\n"); + // WARNING: Relatively disgusting hack. hiding classes is not a good thing + if (settings.getConnectionType().isUseChildFirstClassLoader()) { + loader = new ChildFirstClassloader(entryArray, ClassLoaderFactory.class.getClassLoader()); + } else { + // TODO was NestedJarClassLoader + //loader = new ChildFirstClassloader(entryArray, ClassLoaderFactory.class.getClassLoader()); + loader = new URLClassLoader(entryArray, ClassLoaderFactory.class.getClassLoader()); + //loader = new NestedJarClassLoader(entryArray, ClassLoaderFactory.class.getClassLoader()); } - log.debug(buf.toString()); + + classLoaderCache.put(key, new WeakReference<ClassLoader>(loader)); + + if (log.isDebugEnabled()) { + StringBuffer buf = new StringBuffer("Classloader built with: \n"); + for (URL url : entries) { + buf.append("\t").append(url).append("\n"); + } + log.info(buf.toString()); + } + } return loader; } Modified: trunk/mc4j/modules/ems/src/ems-impl/org/mc4j/ems/impl/jmx/connection/bean/DMBean.java =================================================================== --- trunk/mc4j/modules/ems/src/ems-impl/org/mc4j/ems/impl/jmx/connection/bean/DMBean.java 2008-04-10 19:09:32 UTC (rev 588) +++ trunk/mc4j/modules/ems/src/ems-impl/org/mc4j/ems/impl/jmx/connection/bean/DMBean.java 2008-04-10 19:52:05 UTC (rev 589) @@ -155,16 +155,18 @@ this.notifications.put(notificationInfo.getName(), notification); } - loaded = true; } catch (InstanceNotFoundException infe) { this.deleted = true; } catch (Exception e) { unsupportedType = true; RuntimeException f = new EmsUnsupportedTypeException("Could not load MBean info, unsupported type on bean " + objectName, e); - registerFailure(f); + // TODO: Memory Leak below... don't do that + //registerFailure(f); // TODO should we throw this here? //throw f; + } finally { + loaded = true; } } Modified: trunk/mc4j/modules/ems/src/ems-impl/org/mc4j/ems/impl/jmx/connection/bean/operation/DOperation.java =================================================================== --- trunk/mc4j/modules/ems/src/ems-impl/org/mc4j/ems/impl/jmx/connection/bean/operation/DOperation.java 2008-04-10 19:09:32 UTC (rev 588) +++ trunk/mc4j/modules/ems/src/ems-impl/org/mc4j/ems/impl/jmx/connection/bean/operation/DOperation.java 2008-04-10 19:52:05 UTC (rev 589) @@ -103,6 +103,30 @@ i++; } + // TODO GH: get rid of the asynchronous bits and the timeouts for now (not good for RHQ JMX plugin) + // Add a way to let the caller decide if they want async + try { + Object results = + bean.getConnectionProvider().getMBeanServer().invoke( + bean.getObjectName(), + getName(), + parameterValues, + parameterTypes); + + return results; + } catch (ReflectionException re) { + Exception cause = re.getTargetException(); + if (cause != null) { + throw new EmsInvocationException("Exception on invocation of [" + getName() + "]" + cause.toString(), cause); + } else { + throw new EmsInvocationException("Exception on invocation of [" + getName() + "]" + re.toString(), re); + } + } catch (Exception e) { + throw new EmsInvocationException("Exception on invocation of [" + getName() + "]" + e.toString(), e); + } + + /* + class Future { boolean done = false; Object results; @@ -150,14 +174,11 @@ throw new EmsInvocationException("Operation timed out."); } - - - if (f.e != null) { throw new EmsInvocationException("Exception on invocation of [" + getName() + "]" + f.e.toString(),f.e); } else { return f.results; - } + }*/ } public int compareTo(Object o) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |