BaseModelMBean.addNotificationListener() registers the listener on attributeBroadcaster, while BaseModelMBean.removeNotificationListener() fails to clean that up. The end result is a memory leak that is very apparent when you embed directly in your WAR file jmxremote_optional.jar as the com.sun.jmx.remote.opt.internal.ArrayNotificationBuffer$BufferListener' classloader cannot be garbage collected which end up depleting the perm gen merely after a few redeploys.
This has been fixed in 8.0.x for 8.0.6 onwards. This has been fixed in 7.0.x for 7.0.54 onwards.
I re-filed this at Apache Commons Modeler project as https://issues.apache.org/jira/browse/MODELER-31 Proposed for Tomcat 6.
The fix has been applied to 6.0.x and will be included in 6.0.40 onwards.