< 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 >