Replying to myself: --- Brian Stansberry <[EMAIL PROTECTED]> wrote: > Simon, > > I spent some time last night looking at this, mostly > just familiarizing myself with how beanutils works > so > I could understand the problem. > > I think you're right to be concerned about JCL, as > from what I can see the two applications are very > similar: > > "weak-keyed" map (aka "WeakMap") held statically by > class loaded by container (beanutils: > BeanUtilsBean.beanByClassLoader; JCL: > LogFactory.factories). > > WeakMap key is the TCCL. > > WeakMap value is a class loaded by container, but > value is instantiated while component loader is the > TCCL (beanutils: BeanUtilsBean; JCL: > LogFactoryImpl). > > WeakMap value holds another map (aka "StrongMap") > (beanutils: > BeanUtilsBean.convertUtilsBean.converters; > JCL: LogFactory.instances) > > StrongMap value is a class loaded by the component > loader (beanutils: FloatConverter; JCL: > Log4jLogger). > Class implements an interface loaded by the > container > loader (beanutils: Converter; JCL: Log). This > reference is likely what's preventing release of the > classloader in beanutils. >
After exploring more with the JCL code, I'm almost certain the reference to FloatConverter in BeanUtilsBean.convertUtilsBean.converters is what's causing o.a.c.beanutils.converter.MemoryTestCase to fail. When I wrote before, I only said "likely" because I couldn't see why JCL wouldn't always have the same failure, and I had tests where it didn't. But I've now created tests where it does (see below); tests that are basically analogous to MemoryTestCase. > I noticed that the JCL unit test I wrote for memory > release has a weakness in that it doesn't add the > Log > instance to LogFactoryImpl.instances. I noticed > that > a week ago and added the required call so I could > check the tests still passed. They did. But, > didn't > get a chance to clean up the code and submit a > proper > patch for the tests. My bad :( > > I'll for sure do that tonight, plus add some more > assertions like the beanutils test has in order to > ensure that classes are being loaded by the intended > loader. This should either surface a problem in JCL > or help shed some light on the beanutils problem. > Will have to be another day before I submit a patch for the JCL tests (after midnight now). But, I've found in JCL the classloader is not released when LogFactoryImpl is loaded by a parent loader and the Log wrapper is loaded by a child. I've identified two basic configurations where this might happen: 1) Parent-first delegation model, where the parent has commons-logging-api.jar, child has commons-logging.jar and child wants to use Log4j or Avalon (or some custom Log implementation). 2) Child-first delegation model that uses the configuration I proposed in my "Further Analysis" document; i.e. where the parent has commons-logging-api-xxx.jar, child has commons-logging-impl.jar and child wants to use Log4j or Avalon. Brian __________________________________ Do you Yahoo!? Make Yahoo! your home page http://www.yahoo.com/r/hs --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]