The GC will kick in more often when memory gets tight. The precise way it does it is governed by some nonstandard tuning options.
What would be best for GC in games, in order of preference, is:
1. Don't create any objects
2. Stack allocation of objects, coming soon to a JVM near you
3. Incremental & concurrent collection
4. Time-limited running (limit to 1ms, for example)
5. Synchronized running with vertical blanking interval
Everything else about the Java GC is perfect. All that Reference stuff is probably way more complex than is needed for a game though and could easily be left out of a game-specific JVM.