I give the Java Memory Profiler (JMP) a Silver medal, no Gold, no, my mistake, Silver (pending appeal).
It is written in C (herecy!) but for 2 very good reasons, firstly the JVM interface is a native one anyway, and secondly it needs to out perform the JVM to work at all.
The UI is GTK+ based, which means that the Windows version is a bit fiddly to install. And provides a simple uncomplicated interface to controlling the program. There is, however, a way to use it without the UI, presumably for shell based usage.
Feature wise, JMP does the basics. If you work the JVM built in profiler hard then you just about get what JMP gives you out of the box. If you work JMP hard then you can get results that are just as useful as those from a pro tool like JProbe.
The latest version just released contains a call tree display, which is a useful addition, and also improves on the filtering capabilities. JMP provides a very effective way to analyse memory usage and time spent in method calls.