JDK 6 comes with a useful tool, VisualVM. You can start it by running the command jvisualvm, and you can use it to connect to running Java virtual machines and see all kinds of things, like the amount of memory being used, how many threads there are and if they're running or not etc.
You can use the JVM command for verbose GC: -verbose:gc
This will output (to standard out) ongoing garbage collection (memory) information with a timestamp so you can get a profile of what memory is being reclaimed and when.
There are some undocumented -XX JVM options available that can help.