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