RFR (S): Enable ShenandoahConcurrentCodeRoots

Aleksey Shipilev shade at redhat.com
Tue Jan 31 12:35:37 UTC 2017


Hi,

While investigating the cause for the bimodal behavior for Init-Mark:

 [14.162s][info][gc] GC(1) Pause Init-Mark 3.810ms
 [17.943s][info][gc] GC(2) Pause Init-Mark 3.327ms
 [20.599s][info][gc] GC(3) Pause Init-Mark 3.442ms
 [22.953s][info][gc] GC(4) Pause Init-Mark 0.819ms
 [25.357s][info][gc] GC(5) Pause Init-Mark 2.861ms
 [27.838s][info][gc] GC(6) Pause Init-Mark 3.013ms
 [30.602s][info][gc] GC(7) Pause Init-Mark 3.440ms
 [33.417s][info][gc] GC(8) Pause Init-Mark 3.113ms
 [36.279s][info][gc] GC(9) Pause Init-Mark 0.838ms
 [39.098s][info][gc] GC(10) Pause Init-Mark 3.264ms
 [41.880s][info][gc] GC(11) Pause Init-Mark 2.713ms
 [44.635s][info][gc] GC(12) Pause Init-Mark 2.832ms
 [47.135s][info][gc] GC(13) Pause Init-Mark 2.876ms
 [49.514s][info][gc] GC(14) Pause Init-Mark 0.856ms

...found that scanning code cache when class_unload=false takes a few
milliseconds. Then discovered ShenandoahConcurrentCodeRoots, which scans the
code roots in concurrent marking workers under the CodeCache_lock. Enabling it
seems to help with Init-Mark times!

 before: Initial Mark Pauses (net)   =     0.51 s (a =     2648 us) (n =   193)
    (lvls, us =      686,     2734,     2969,     3125,     4058)

  after: Initial Mark Pauses (net)   =     0.24 s (a =     1173 us) (n =   202)
    (lvls, us =      752,     1113,     1172,     1250,     3046)

I cannot see the theoretical problems with enabling it. Both jcstress and
hotspot_gc_shenandoah pass with the flag turned on by default too. So, let's do it:
  http://cr.openjdk.java.net/~shade/shenandoah/codecache-scan/webrev.01/

Thanks,
-Aleksey



More information about the shenandoah-dev mailing list