< prev index next >

src/share/vm/gc/g1/g1CollectedHeap.cpp

Print this page




4957   bool claim_clean_klass_tree_task() {
4958     if (_clean_klass_tree_claimed) {
4959       return false;
4960     }
4961 
4962     return Atomic::cmpxchg(1, (jint*)&_clean_klass_tree_claimed, 0) == 0;
4963   }
4964 
4965   InstanceKlass* claim_next_klass() {
4966     Klass* klass;
4967     do {
4968       klass =_klass_iterator.next_klass();
4969     } while (klass != NULL && !klass->oop_is_instance());
4970 
4971     return (InstanceKlass*)klass;
4972   }
4973 
4974 public:
4975 
4976   void clean_klass(InstanceKlass* ik) {
4977     ik->clean_implementors_list(_is_alive);
4978     ik->clean_method_data(_is_alive);
4979 
4980     // G1 specific cleanup work that has
4981     // been moved here to be done in parallel.
4982     ik->clean_dependent_nmethods();
4983   }
4984 
4985   void work() {
4986     ResourceMark rm;
4987 
4988     // One worker will clean the subklass/sibling klass tree.
4989     if (claim_clean_klass_tree_task()) {
4990       Klass::clean_subklass_tree(_is_alive);
4991     }
4992 
4993     // All workers will help cleaning the classes,
4994     InstanceKlass* klass;
4995     while ((klass = claim_next_klass()) != NULL) {
4996       clean_klass(klass);
4997     }
4998   }
4999 };
5000 
5001 // To minimize the remark pause times, the tasks below are done in parallel.
5002 class G1ParallelCleaningTask : public AbstractGangTask {




4957   bool claim_clean_klass_tree_task() {
4958     if (_clean_klass_tree_claimed) {
4959       return false;
4960     }
4961 
4962     return Atomic::cmpxchg(1, (jint*)&_clean_klass_tree_claimed, 0) == 0;
4963   }
4964 
4965   InstanceKlass* claim_next_klass() {
4966     Klass* klass;
4967     do {
4968       klass =_klass_iterator.next_klass();
4969     } while (klass != NULL && !klass->oop_is_instance());
4970 
4971     return (InstanceKlass*)klass;
4972   }
4973 
4974 public:
4975 
4976   void clean_klass(InstanceKlass* ik) {
4977     ik->clean_weak_instanceklass_links(_is_alive);





4978   }
4979 
4980   void work() {
4981     ResourceMark rm;
4982 
4983     // One worker will clean the subklass/sibling klass tree.
4984     if (claim_clean_klass_tree_task()) {
4985       Klass::clean_subklass_tree(_is_alive);
4986     }
4987 
4988     // All workers will help cleaning the classes,
4989     InstanceKlass* klass;
4990     while ((klass = claim_next_klass()) != NULL) {
4991       clean_klass(klass);
4992     }
4993   }
4994 };
4995 
4996 // To minimize the remark pause times, the tasks below are done in parallel.
4997 class G1ParallelCleaningTask : public AbstractGangTask {


< prev index next >