¿Cómo hace la actualización de GC las referencias después de la compactación?

El .NET Garbage Collector recopila objetos (recupera su memoria) y también realiza la compactación de la memoria (para mantener la fragmentación de la memoria al mínimo).

Me pregunto, ya que una aplicación puede tener muchas referencias a objetos, cómo el GC (o el CLR) administra estas referencias a los objetos, cuando la dirección del objeto cambia debido a la compactación realizada por el GC.