< 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


 209   ShenandoahConcurrentStringDedupRoots();
 210   ~ShenandoahConcurrentStringDedupRoots();
 211 
 212   void oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
 213 };
 214 
 215 class ShenandoahCodeCacheRoots {
 216 private:
 217   ShenandoahPhaseTimings::Phase _phase;
 218   ShenandoahCodeRootsIterator   _coderoots_iterator;
 219 public:
 220   ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase);
 221   ~ShenandoahCodeCacheRoots();
 222 
 223   void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id);
 224 };
 225 
 226 template <bool CONCURRENT, bool SINGLE_THREADED>
 227 class ShenandoahClassLoaderDataRoots {
 228 private:

 229   ShenandoahPhaseTimings::Phase _phase;








 230 public:
 231   ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase);
 232   ~ShenandoahClassLoaderDataRoots();
 233 
 234   void always_strong_cld_do(CLDClosure* clds, uint worker_id);
 235   void cld_do(CLDClosure* clds, uint worker_id);
 236 };
 237 
 238 class ShenandoahRootProcessor : public StackObj {
 239 private:
 240   ShenandoahHeap* const               _heap;
 241   const ShenandoahPhaseTimings::Phase _phase;
 242   const ShenandoahGCWorkerPhase       _worker_phase;
 243 public:
 244   ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase);
 245 
 246   ShenandoahHeap* heap() const { return _heap; }
 247 };
 248 
 249 class ShenandoahRootScanner : public ShenandoahRootProcessor {
 250 private:
 251   ShenandoahSerialRoots                                     _serial_roots;




 209   ShenandoahConcurrentStringDedupRoots();
 210   ~ShenandoahConcurrentStringDedupRoots();
 211 
 212   void oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
 213 };
 214 
 215 class ShenandoahCodeCacheRoots {
 216 private:
 217   ShenandoahPhaseTimings::Phase _phase;
 218   ShenandoahCodeRootsIterator   _coderoots_iterator;
 219 public:
 220   ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase);
 221   ~ShenandoahCodeCacheRoots();
 222 
 223   void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id);
 224 };
 225 
 226 template <bool CONCURRENT, bool SINGLE_THREADED>
 227 class ShenandoahClassLoaderDataRoots {
 228 private:
 229   ShenandoahSharedSemaphore     _semaphore;
 230   ShenandoahPhaseTimings::Phase _phase;
 231 
 232   static uint worker_count(uint n_workers) {
 233     // Limit concurrency a bit, otherwise it wastes resources when workers are tripping
 234     // over each other. This also leaves free workers to process other parts of the root
 235     // set, while admitted workers are busy with doing the CLDG walk.
 236     return MAX2(1u, MIN2(ShenandoahSharedSemaphore::max_tokens(), n_workers / 2));
 237   }
 238 
 239 public:
 240   ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase, uint n_workers);
 241   ~ShenandoahClassLoaderDataRoots();
 242 
 243   void always_strong_cld_do(CLDClosure* clds, uint worker_id);
 244   void cld_do(CLDClosure* clds, uint worker_id);
 245 };
 246 
 247 class ShenandoahRootProcessor : public StackObj {
 248 private:
 249   ShenandoahHeap* const               _heap;
 250   const ShenandoahPhaseTimings::Phase _phase;
 251   const ShenandoahGCWorkerPhase       _worker_phase;
 252 public:
 253   ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase);
 254 
 255   ShenandoahHeap* heap() const { return _heap; }
 256 };
 257 
 258 class ShenandoahRootScanner : public ShenandoahRootProcessor {
 259 private:
 260   ShenandoahSerialRoots                                     _serial_roots;


< prev index next >