|
From: Guillaume P. <gpo...@gl...> - 2004-05-29 04:12:44
|
I experimented some more about this cleanup issue, and I was able to narrow down the problem to the caching done by the java.beans.Introspector. It stores the BeanInfo instances in a WeakHashMap, but in that Map implementation, only the keys uses WeakReference, the values are stored with hard references since BeanInfo has an hard reference on the class it gives info about (indirectly through BeanDescriptor and others), any time Introspector.getBeanInfo(Class) is used, that class and it's static members will not ever be able to be garbage collected. I kind of remember someone mentioning something related to this in the mailling list, but I cannot find the mail. I wonder if there's other case where the java[x] classes might have an hard reference on a class or its instances. A fix for this particular problem is to have a ServletContextListener call Introspector.flushCaches() when the context is destroyed. It seems like a known issue at Sun : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4291376 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4730581 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4809008 So, unless I'm missing something here, that means fixes like using synchronization and WeakReference on singleton probably won't help much if at all. The only way that I can see for a class not to be gargage collected when no more active thread use it, is if another ClassLoader has an hard reference to the class instance, or an instance of that class. Having the class itself have an hard reference on a its own singleton has no effect, it's a circular reference that will not prevent the class or the instance to be gargabe collected when neither is being refered to by something else. Guillaume |