Unlike heap space the perm-gen space (which holds class definitions, final vars, and interned Strings) doesn't get cleared out when you reload an application. So, every time you reload, you're adding a new set of class defs to the the perm-gen space.
Diagnosing a Tomcat that does not respond is tricky. The question you need to answer is this: "what are the threads doing, if they are not serving HTTP requests?" Here is some info to get you started with analysing thread dumps.
I did find something. When running jstack I had 40 HTTP threads that were all blocked on a synchronized method. However I could not find a race condition or similar that would explain it. I have rewritten the method to synchronize only the critical part of the code instead of the complete method, so I hope this helps.
You showed up just in time for the waffles! And this tiny ad:
Building a Better World in your Backyard by Paul Wheaton and Shawn Klassen-Koop