< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp
Print this page
rev 59533 : 8246097: Shenandoah: limit parallelism in CLDG root handling
Reviewed-by: XXX
@@ -224,13 +224,22 @@
};
template <bool CONCURRENT, bool SINGLE_THREADED>
class ShenandoahClassLoaderDataRoots {
private:
+ ShenandoahSharedSemaphore _semaphore;
ShenandoahPhaseTimings::Phase _phase;
+
+ static uint worker_count(uint n_workers) {
+ // Limit concurrency a bit, otherwise it wastes resources when workers are tripping
+ // over each other. This also leaves free workers to process other parts of the root
+ // set, while admitted workers are busy with doing the CLDG walk.
+ return MAX2(1u, MIN2(ShenandoahSharedSemaphore::max_tokens(), n_workers / 2));
+ }
+
public:
- ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase);
+ ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase, uint n_workers);
~ShenandoahClassLoaderDataRoots();
void always_strong_cld_do(CLDClosure* clds, uint worker_id);
void cld_do(CLDClosure* clds, uint worker_id);
};
< prev index next >