@@ -1693,19 +1693,20 @@ class ShenandoahParallelHeapRegionTask : public WorkerTask {
16931693private:
16941694 ShenandoahHeap* const _heap;
16951695 ShenandoahHeapRegionClosure* const _blk;
1696+ size_t const _stride;
16961697
16971698 shenandoah_padding (0 );
16981699 volatile size_t _index;
16991700 shenandoah_padding (1 );
17001701
17011702public:
1702- ShenandoahParallelHeapRegionTask (ShenandoahHeapRegionClosure* blk) :
1703+ ShenandoahParallelHeapRegionTask (ShenandoahHeapRegionClosure* blk, size_t stride ) :
17031704 WorkerTask (" Shenandoah Parallel Region Operation" ),
1704- _heap (ShenandoahHeap::heap()), _blk(blk), _index(0 ) {}
1705+ _heap (ShenandoahHeap::heap()), _blk(blk), _stride(stride), _index(0 ) {}
17051706
17061707 void work (uint worker_id) {
17071708 ShenandoahParallelWorkerSession worker_session (worker_id);
1708- size_t stride = ShenandoahParallelRegionStride ;
1709+ size_t stride = _stride ;
17091710
17101711 size_t max = _heap->num_regions ();
17111712 while (Atomic::load (&_index) < max) {
@@ -1724,8 +1725,20 @@ class ShenandoahParallelHeapRegionTask : public WorkerTask {
17241725
17251726void ShenandoahHeap::parallel_heap_region_iterate (ShenandoahHeapRegionClosure* blk) const {
17261727 assert (blk->is_thread_safe (), " Only thread-safe closures here" );
1727- if (num_regions () > ShenandoahParallelRegionStride) {
1728- ShenandoahParallelHeapRegionTask task (blk);
1728+ const uint active_workers = workers ()->active_workers ();
1729+ const size_t n_regions = num_regions ();
1730+ size_t stride = ShenandoahParallelRegionStride;
1731+ if (stride == 0 && active_workers > 1 ) {
1732+ // Automatically derive the stride to balance the work between threads
1733+ // evenly. Do not try to split work if below the reasonable threshold.
1734+ constexpr size_t threshold = 4096 ;
1735+ stride = n_regions <= threshold ?
1736+ threshold :
1737+ (n_regions + active_workers - 1 ) / active_workers;
1738+ }
1739+
1740+ if (n_regions > stride && active_workers > 1 ) {
1741+ ShenandoahParallelHeapRegionTask task (blk, stride);
17291742 workers ()->run_task (&task);
17301743 } else {
17311744 heap_region_iterate (blk);
0 commit comments