Memory leak in ClassAncestry

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Done
    • Priority: Major - P3
    • None
    • Affects Version/s: 2.11.3
    • Component/s: BSON
    • None
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      ClassAncestry stores references to my classes (like enums that I use in the queries), never releases these references, which prevent the WebappClassloader and all the classes it loaded to be reclaimed by the garbage collector when I undeploy my webapp.

      I'm currently working around using reflection.

      @SuppressWarnings("unchecked")
      public static void cleanupMongoDriver(ClassLoader webappClassLoader) {
      
      	ClassLoader bsonLoader = ClassMap.class.getClassLoader();
      	Class<?> clazz;
      	try {
      		clazz = Class.forName("org.bson.util.ClassAncestry", true, bsonLoader);
      	} catch (ClassNotFoundException e) {
      		return;
      	}
      
      	ConcurrentMap<Class<?>, List<Class<?>>> _ancestryCache;
      	try {
      		Field f = clazz.getDeclaredField("_ancestryCache");
      		f.setAccessible(true);
      		_ancestryCache = (ConcurrentMap<Class<?>, List<Class<?>>>) f.get(null);
      	} catch (Exception e) {
      		return;
      	}
      	List<Class<?>> toRemove = new ArrayList<Class<?>>();
      	for (Class<?> c : _ancestryCache.keySet()) {
      		if (c.getClassLoader() == webappClassLoader) {
      			toRemove.add(c);
      		}
      	}
      	for (Class<?> c : toRemove) {
      		_ancestryCache.remove(c);
      	}
      }
      

            Assignee:
            Unassigned
            Reporter:
            Michel Yerly
            None
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: