To diagnose the problem, we searched for a memory profiler. In C++ we have valgrind, but for Java, so far we didn’t find a memory profiler to our liking.
Several candidate profilers are either hard to install, very slow or too entangled with an IDE like Eclipse/Netbeans.
As our server push implementation requires a servlet 3.0 container, we test the simplechat example using an external Jetty 8 prerelease. After some looking around, we stumbled upon tijmp, a lightweight memory profiler, which can be installed easily via apt-get (on Ubuntu 9.04), supports JDK6 (a requirement for Jetty 8), and turns out to work very fast.
Basically we were able to set things up simply by apt-getting the tijmp package, and passing -agentlib:tijmp as an argument to the Java Virtual Machine.
When starting the JVM, a small user interface automatically pops up and allows you to request different types of statistics and force garbage collection.
We are still looking for a no-nonsense CPU profiler though…