Hi, I have just the same problem as described here (a custom classloader that cannot be finalized). The proposed solution looks promising and works in a local prototype.
However, before I finally adopt this fix - could somebody pleaser confirm that clearing the static maps this way won't raise any other issues? And are there anym plans to incorporate this into future Jess releases? thanks, Joerg -----Ursprüngliche Nachricht----- Von: owner-jess-us...@sandia.gov [mailto:owner-jess-us...@sandia.gov] Im Auftrag von Grube, Ralf Gesendet: Freitag, 28. Mai 2010 13:48 An: jess-users@sandia.gov Betreff: JESS: Static root reference to custom classloader through jess.ReflectFunctions.s_descriptors avoids garbage collection Hi, we face to a problem where our classloader can't be finalized by the garbage collector. Let me shortly explain our context. We have an endless running application which has the Jess library in its classpath. Additionally we load classes with a custom classloader from separate jar files. These classes are used in deftemplate from-class statements to be used in the engine. The custom classloader is provided to the Rete (Rete.setClassLoader()). I've analyzed the heap dump and found a lot of root reference chains to our custom classloader. All of them contain the static map jess.ReflectFunctions.s_descriptors. As far as I understand the code, there is some kind of Bean introspection for classes used in deftemplate from-class statements. The results of this introspection seem to be cached in this static map. jess.ReflectFunctions is loaded by our application classloader and holds static references to the deftemplate classes and hence to our custom classloader. The missing classloader finalization is critical in our scenario, because all of its loaded classes remain in the PermGenSpace of the heap. As a result the application will run into OutOfMemoryExceptions over time. At the moment I have fixed this by implementing a static clean method in jess.ReflectFunctions, which clears the map: public static void clearDescriptorsCache(){ ReflectFunctions.s_descriptors.clear(); } As jess.ReflectFunctions is a package protected class, I call this new function from the Rete.clear() method: m_deffacts.clear(); m_defglobals.clear(); m_classSource.clear(); //clear descriptor cache in ReflectFunctions to destroy root references to business model classloader ReflectFunctions.clearDescriptorsCache(); broadcastEvent(JessEvent.CLEAR, this, m_globalContext); Two question, I have: Might there be problems doing it this way? If the answer is no, is it possible to include this as part of the next release? Regards, Ralf -------------------------------------------------------------------- To unsubscribe, send the words 'unsubscribe jess-users y...@address.com' in the BODY of a message to majord...@sandia.gov, NOT to the list (use your own address!) List problems? Notify owner-jess-us...@sandia.gov. --------------------------------------------------------------------