Whenever encounter memory leak or performance problem, profiler will be your great friend.
Sometimes before, I have used some well known profiling tools like YourKit or hprof, jmap, tools, but recently, I discover JDK 6 has bundled with a new tools called VisualVM.
Indeed, the VisualVM is itself a self contained project, it provides some common monitoring features like thread/heap monitoring, as well as cpu / memory profiling features. It also allows you taking snapshots and compare memory snapshot.
IMO, it should deserve much more attention than its currently have. And it is really a perfect tools for most performance monitoring / tunning needs.