The class org.apache.tomcat.util.IntrospectionUtils caches the methods of classes used as parameters to the findMethods() method. This cache has hard references, so when used against an application class (often an exception), the classloader of that application will never be unloaded. Notice that changing the cache to a WeakHashMap would not help, as the class reference is also inside the Method object stored in the value field. I think the same class (IntrospectionUtils) exists in the commons-modeler library, with the same problem.
There is more information about the general problem of not being able to GC class loaders at this wiki page: http://opensource2.atlassian.com/confluence/spring/pages/viewpage.action? pageId=2669
The commons-modeler IntrospectionUtils should not be a problem for regular Tomcat operation. However, I see org.apache.tomcat.util.IntrospectionUtils is indeed used on exceptions that come out of the web application, so there is a problem for custom exception types. I will add a clear method to org.apache.tomcat.util.IntrospectionUtils as conserving the cache seems necessary.
I added a clear method which is called when stopping the classloader, so the issue is fixed in org.apache.tomcat.util.IntrospectionUtils.