For profiling I'm currently using jvisualvm (comes with JDK 6) and for monitoring garbage collection I use, visualgc from the jvmstat bundle.
At the moment, I'm looking for ways to collect the maximum amount of memory during collections (both major and minor) with emphasis on collecting the most amount of memory during major gcs.
Our primary focus is on reducing the number of small minor collections and making the most out of major collections. Max heap size we can have for the said application is 1G.
Hope you can direct me to the right references and tools. Thanks.