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