I've been analyzing some heaps lately and am still very disappointed at the tooling for doing this kind of thing in Java. The first step is creating a heap dump. I am using a Sun Java 6 JVM so I used jmap to dump the heap.
The file was pretty big, 650MB. Next step is analyzing it. First attempt was to use jhat in the Sun JVM. This is pretty much useless. It just lets you walk the heap but I can't figure out how to get it to tell me which objects have the most instances etc. I don't see what that is useful for as a result.
Next was the IBM Alphaworks heap analyzer. First issue there was just loading the file. We failed to load it on our Laptops (4GB). Next I used one of my Mac Pros (32GB RAM) using a 64 bit JVM with a 16GB heap and now it loads but it was pretty buggy and was spitting exceptions in the console like nobodies business. We had a lot of trouble just getting it to respond to right clicks for displaying parents etc. So, this isn't great either.
Next, we downloaded the Eclipse Memory Leak Analyzer and this was the best of the lot by far and is what we're using now. You download this and it runs as it's own private eclipse instance. It loaded the file with no issues using defaults so this works on a laptop. It lets you get at all the information and doesn't spit exceptions at you so this is a huge (HUGE) step up on the Alphaworks heap analyzer. This is what we're using now for checking heap usage dumps.
We prefer a dump a file approach rather than live checking with commercial profilers just because it seems to be more stable. Attaching profilers seems to usually cause a crash etc so dumping the heap and then examining offline seems more useful.