Yea, I was never able to get good performance from G1GC either. In fairness, I don't know if the J6 implementation is different than the J7 one, and it would not surprise me if J7 has a better version of it.
Now, keep in mind that I've been given a few ideas to check into, but I have not yet had the time:
1. Turn off "-server" -- while I put it on when running the minecraft server, someone said that it tells java "assume you are the only significant thing running, and gobble all the resources you need".
2. By default, G1GC in J6 basically promotes every object to survivor at every minor collection, and has minor collections constantly. Without some way to restrict the frequency of these minor collections, no junk object ever expires.
With that said, I was able to get some improvement by explicitly specifying eden/survivor space size, but I could not get enough time for the "copy until it reaches the threshold or dies off" behavior to actually get the die-off effect (which seems to take somewhere in the 6 to 20 second range ... still investigating that).
So I know that there is room for improvement, I just don't know what flags exist / can be tuned/tweaked.
3. CMS seems to do more of its work in concurrent threads; G1GC seems to do more "stop the world" activity. That's great for web servers, but horrible for response critical gaming. If there is a difference in J6/J7, I suspect this will be the biggest point of change.