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