RFR: Parallel heap region iteration

Aleksey Shipilev shade at redhat.com
Wed Oct 24 14:39:03 UTC 2018


http://cr.openjdk.java.net/~shade/shenandoah/parallel-hri/webrev.01/

This pile of 4 changesets improves pause times with huge number of regions. (For example, 8 TB heap
has 262K regions, 32M each). It cleans up existing usages for heap_region_iterate, introduces its
parallel version, and hooks up Clean/Complete liveness to it.

Motivational example with 400K regions, which roughly simulates ~12 TB heap:

-XX:ShenandoahParallelRegionStride=1M (no parallelism):

 Pause Init Mark (N)  = 0.04 s (a =  7860 us) (n = 5) (lvls, us =  7598,  7598,  7734,  7754,  8159)
   Clear Liveness     = 0.04 s (a =  7568 us) (n = 5) (lvls, us =  7422,  7422,  7500,  7520,  7795)
 Pause Final Mark (N) = 0.17 s (a = 33306 us) (n = 5) (lvls, us = 30273, 30273, 31250, 31641, 36763)
   Complete Liveness  = 0.03 s (a =  6146 us) (n = 5) (lvls, us =  5801,  5801,  6016,  6250,  6317)
   Prepare Evacuation = 0.13 s (a = 25518 us) (n = 5) (lvls, us = 23633, 23633, 24023, 24023, 29174)

-XX:ShenandoahParallelRegionStride=1K (new default):

Pause Init Mark (N)   = 0.01 s (a =  1980 us) (n = 5) (lvls, us =  1875,  1875,  1895,  1914,  2271)
  Clear Liveness      = 0.01 s (a =  1707 us) (n = 5) (lvls, us =  1660,  1660,  1680,  1719,  1728)
Pause Final Mark (N)  = 0.14 s (a = 27489 us) (n = 5) (lvls, us = 25977, 25977, 26172, 26172, 32521)
  Complete Liveness   = 0.01 s (a =  1485 us) (n = 5) (lvls, us =  1426,  1426,  1426,  1484,  1542)
  Prepare Evacuation  = 0.12 s (a = 24344 us) (n = 5) (lvls, us = 23828, 23828, 24023, 24023, 25099)

[Long cset selection times are for follow-up]

It does not regress pauses with our usual number of regions (2K). The stride is chosen below 2K to
exercise that code anyway.

Testing: tier3_gc_shenandoah

Thanks,
-Aleksey



More information about the shenandoah-dev mailing list