RFR: Heap region count selection should only consider max heap size

Aleksey Shipilev shade at redhat.com
Fri Jul 13 08:10:08 UTC 2018


We have borrowed the simple region count heuristics from G1. There, G1 wants to have larger regions,
because reasons: https://bugs.openjdk.java.net/browse/JDK-8019902. Shenandoah generally wants larger
regions too, and it claims max heap size under pressure.

In Shenandoah, initial heap size only serves as the guidance for initial committed heap. But current
heuristics is very sensitive to the -Xms setting, because it would affect the number of regions in
the heap, which would affect the max TLAB size available for allocs, and some of our internal time
and memory overhead processing the regions.

Let's just depend on max_heap_size to consistently get larger regions:

diff -r c458d4021216 src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp
--- a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp	Fri Jul 13 08:48:07 2018 +0200
+++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp	Fri Jul 13 10:05:25 2018 +0200
@@ -590,13 +590,14 @@
     if (ShenandoahMinRegionSize > ShenandoahMaxRegionSize) {
       err_msg message("Minimum (" SIZE_FORMAT "K) should be larger than maximum (" SIZE_FORMAT "K).",
                       ShenandoahMinRegionSize/K, ShenandoahMaxRegionSize/K);
       vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize or
-XX:ShenandoahMaxRegionSize", message);
     }
-    size_t average_heap_size = (initial_heap_size + max_heap_size) / 2;
-    region_size = MAX2(average_heap_size / ShenandoahTargetNumRegions,
-                       ShenandoahMinRegionSize);
+
+    // We rapidly expand to max_heap_size in most scenarios, so that is the measure
+    // for usual heap sizes. Do not depend on initial_heap_size here.
+    region_size = max_heap_size / ShenandoahTargetNumRegions;

     // Now make sure that we don't go over or under our limits.
     region_size = MAX2(ShenandoahMinRegionSize, region_size);
     region_size = MIN2(ShenandoahMaxRegionSize, region_size);


Baseline, -Xms100g -Xmx100g:

  [0.002s][info][gc,init] Region size in bytes: 33554432
  [0.002s][info][gc,init] Region size byte shift: 25
  [0.002s][info][gc,init] Humongous threshold in bytes: 33554432
  [0.002s][info][gc,init] Max TLAB size in bytes: 33554432
  [0.002s][info][gc,init] Number of regions: 3200

  Benchmark                      (size)  Mode  Cnt        Score       Error   Units
  IntArray.test                   10000  avgt    5      177.701 ±     0.890   ns/op
  IntArray.test:·gc.alloc.rate    10000  avgt    5  3120083.269 ± 14055.559  MB/sec


Baseline, -Xmx100g:

  [0.002s][info][gc,init] Region size in bytes: 16777216
  [0.002s][info][gc,init] Region size byte shift: 24
  [0.002s][info][gc,init] Humongous threshold in bytes: 16777216
  [0.002s][info][gc,init] Max TLAB size in bytes: 16777216
  [0.002s][info][gc,init] Number of regions: 6400

  Benchmark                     (size)  Mode  Cnt        Score       Error   Units
  IntArray.test                  10000  avgt    5      196.804 ±     1.212   ns/op
  IntArray.test:·gc.alloc.rate   10000  avgt    5  2821176.375 ± 19671.323  MB/sec


Patched, -Xmx100g:

  [0.002s][info][gc,init] Region size in bytes: 33554432
  [0.002s][info][gc,init] Region size byte shift: 25
  [0.002s][info][gc,init] Humongous threshold in bytes: 33554432
  [0.002s][info][gc,init] Max TLAB size in bytes: 33554432
  [0.002s][info][gc,init] Number of regions: 3200

  Benchmark                     (size)  Mode  Cnt        Score       Error   Units
  IntArray.test                  10000  avgt    5      177.776 ±     0.540   ns/op
  IntArray.test:·gc.alloc.rate   10000  avgt    5  3121506.259 ±  8809.584  MB/sec


Thanks,
-Aleksey



More information about the shenandoah-dev mailing list