G1 uses a remembered set per HeapRegions to keep track of all nmethods with oops pointing into that HeapRegion. When objects are moved between HeapRegions, the remembered sets need to be updated.
During the G1 Class Unloading project we found that we spend significantly more time in the "Code Root Migration" time than the time spent scanning the code remembered sets. When G1 starts to unload more objects out of old regions the heuristics find more opportunities to include old regions in the mixed GCs. This has the effect that G1 with Class Unloading sometimes experience longer mixed GC times compared to a build without G1 Class Unloading.
We need to fix this performance problem.