RFR: Elastic TLABs may avoid racily peeking into the free set
Aleksey Shipilev
shade at redhat.com
Tue Jul 17 15:33:37 UTC 2018
CollectedHeap::unsafe_max_tlab_alloc is used to determine the momentary max tlab size, peeking
racily into GC state (thus "unsafe_"). This is needed to avoid retiring regions that would not fit
the max tlab if there is not enough space available in current allocation region. Because it is
racy, it can grossly miscalculate under heavy allocations, when other threads are actively mutating
the current allocation region. Fortunately, with Elastic TLABs, this peeking is not needed, as
allocation path would figure it out itself.
diff -r e2c2bf800963 src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
--- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Tue Jul 17 16:54:17 2018 +0200
+++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Tue Jul 17 17:29:56 2018 +0200
@@ -1370,13 +1370,19 @@
bool ShenandoahHeap::supports_tlab_allocation() const {
return true;
}
-size_t ShenandoahHeap::unsafe_max_tlab_alloc(Thread *thread) const {
- // Returns size in bytes
- return MIN2(_free_set->unsafe_peek_free(), ShenandoahHeapRegion::max_tlab_size_bytes());
+// Returns size in bytes
+size_t ShenandoahHeap::unsafe_max_tlab_alloc(Thread *thread) const {
+ if (ShenandoahElasticTLAB) {
+ // With Elastic TLABs, return the max allowed size, and let the allocation path
+ // figure out the safe size for current allocation.
+ return ShenandoahHeapRegion::max_tlab_size_bytes();
+ } else {
+ return MIN2(_free_set->unsafe_peek_free(), ShenandoahHeapRegion::max_tlab_size_bytes());
+ }
}
size_t ShenandoahHeap::max_tlab_size() const {
// Returns size in words
return ShenandoahHeapRegion::max_tlab_size_words();
Testing: ad-hoc benchmarks, tier1_gc_shenandoah, tier3_gc_shenandoah (running)
Thanks,
-Aleksey
More information about the shenandoah-dev
mailing list