RFR: Full GC should not trash empty regions
Aleksey Shipilev
shade at redhat.com
Tue Mar 20 15:44:46 UTC 2018
http://cr.openjdk.java.net/~shade/shenandoah/fullgc-lazier-empty/webrev.01/
Our Full GC code brings up all empty regions to R-state before the collection. It does so
anticipating the moves into the regions, and relies on R-transition to bring the region into the
committed state. At the end of the collection, it examines the R-state regions, and trashes those
that have no live data, which also covers the E-state regions we have turned into R-state at the
beginning.
It works well, but it is excessive: Full GC at semi-full heap would have lots of E-state regions
that would still be in E-state at the end of the cycle. Current code transits them through
E->R->T->E anyway. It is a small wrinkle, until we get the fastdebug build, which zaps the unused
heap area, and does so per-region during T->E transition. So, we zap the E-state regions again, even
though they are already zapped by construction, and that costs us a lot.
With this fix, AllocObjects with fastdebug/aggressive+EvacOOMALot is at least 5x faster, and stops
timing out every so often on slower machines.
Testing: hotspot_gc_shenandoah
Thanks,
-Aleksey
More information about the shenandoah-dev
mailing list