src/hotspot/share/gc/g1/g1CollectedHeap.cpp
changeset 49821 02c08e20d66c
parent 49818 e57e6addb978
child 49827 a4672513d6e3
equal deleted inserted replaced
49820:663f5d90f0e8 49821:02c08e20d66c
  3455 };
  3455 };
  3456 
  3456 
  3457 Monitor* G1CodeCacheUnloadingTask::_lock = new Monitor(Mutex::leaf, "Code Cache Unload lock", false, Monitor::_safepoint_check_never);
  3457 Monitor* G1CodeCacheUnloadingTask::_lock = new Monitor(Mutex::leaf, "Code Cache Unload lock", false, Monitor::_safepoint_check_never);
  3458 
  3458 
  3459 class G1KlassCleaningTask : public StackObj {
  3459 class G1KlassCleaningTask : public StackObj {
  3460   BoolObjectClosure*                      _is_alive;
       
  3461   volatile int                            _clean_klass_tree_claimed;
  3460   volatile int                            _clean_klass_tree_claimed;
  3462   ClassLoaderDataGraphKlassIteratorAtomic _klass_iterator;
  3461   ClassLoaderDataGraphKlassIteratorAtomic _klass_iterator;
  3463 
  3462 
  3464  public:
  3463  public:
  3465   G1KlassCleaningTask(BoolObjectClosure* is_alive) :
  3464   G1KlassCleaningTask() :
  3466       _is_alive(is_alive),
       
  3467       _clean_klass_tree_claimed(0),
  3465       _clean_klass_tree_claimed(0),
  3468       _klass_iterator() {
  3466       _klass_iterator() {
  3469   }
  3467   }
  3470 
  3468 
  3471  private:
  3469  private:
  3488   }
  3486   }
  3489 
  3487 
  3490 public:
  3488 public:
  3491 
  3489 
  3492   void clean_klass(InstanceKlass* ik) {
  3490   void clean_klass(InstanceKlass* ik) {
  3493     ik->clean_weak_instanceklass_links(_is_alive);
  3491     ik->clean_weak_instanceklass_links();
  3494   }
  3492   }
  3495 
  3493 
  3496   void work() {
  3494   void work() {
  3497     ResourceMark rm;
  3495     ResourceMark rm;
  3498 
  3496 
  3499     // One worker will clean the subklass/sibling klass tree.
  3497     // One worker will clean the subklass/sibling klass tree.
  3500     if (claim_clean_klass_tree_task()) {
  3498     if (claim_clean_klass_tree_task()) {
  3501       Klass::clean_subklass_tree(_is_alive);
  3499       Klass::clean_subklass_tree();
  3502     }
  3500     }
  3503 
  3501 
  3504     // All workers will help cleaning the classes,
  3502     // All workers will help cleaning the classes,
  3505     InstanceKlass* klass;
  3503     InstanceKlass* klass;
  3506     while ((klass = claim_next_klass()) != NULL) {
  3504     while ((klass = claim_next_klass()) != NULL) {
  3543   // The constructor is run in the VMThread.
  3541   // The constructor is run in the VMThread.
  3544   G1ParallelCleaningTask(BoolObjectClosure* is_alive, uint num_workers, bool unloading_occurred) :
  3542   G1ParallelCleaningTask(BoolObjectClosure* is_alive, uint num_workers, bool unloading_occurred) :
  3545       AbstractGangTask("Parallel Cleaning"),
  3543       AbstractGangTask("Parallel Cleaning"),
  3546       _string_symbol_task(is_alive, true, true, G1StringDedup::is_enabled()),
  3544       _string_symbol_task(is_alive, true, true, G1StringDedup::is_enabled()),
  3547       _code_cache_task(num_workers, is_alive, unloading_occurred),
  3545       _code_cache_task(num_workers, is_alive, unloading_occurred),
  3548       _klass_cleaning_task(is_alive),
  3546       _klass_cleaning_task(),
  3549       _resolved_method_cleaning_task() {
  3547       _resolved_method_cleaning_task() {
  3550   }
  3548   }
  3551 
  3549 
  3552   // The parallel work done by all worker threads.
  3550   // The parallel work done by all worker threads.
  3553   void work(uint worker_id) {
  3551   void work(uint worker_id) {