Azul's concurrent GC is much more clever. They use some tricks with memory mapping in order to perform really efficient read barriers (which traditional VMs have considered too costly). This allows compaction to happen while mutator threads proceed.
This is a nice presentation about it: http://www.research.ibm.com/mre05/Click.pdf
And of course the paper: http://usenix.org/events/vee05/full_papers/p46-click.pdf