У нас была точно такая же проблема, и, как отмечает Марк Робинсон, это связано с тем, что классы не собирают мусор.
Особой проблемой, с которой мы столкнулись, было множество загружаемых статических материалов: log4j, контексты Spring, помещенные в статические глобальные переменные, и другие библиотеки классов, создавшие статические экземпляры или синглтоны.
Можно было отследить многие из них с помощью профилировщика, а затем явно заняться очисткой ресурсов в методе destroy()
сервлета. Хотя это не полностью решило проблему, это действительно помогло решить некоторые проблемы.
В конце мы добавили дополнительную пару целей ant для остановки и запуска Tomcat и включили в них процесс сборки. YMMV.