< 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,236 ****
};
template <bool CONCURRENT, bool SINGLE_THREADED>
class ShenandoahClassLoaderDataRoots {
private:
ShenandoahPhaseTimings::Phase _phase;
public:
! ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase);
~ShenandoahClassLoaderDataRoots();
void always_strong_cld_do(CLDClosure* clds, uint worker_id);
void cld_do(CLDClosure* clds, uint worker_id);
};
--- 224,245 ----
};
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, 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 >