< prev index next >

src/share/vm/gc/shared/referenceProcessor.cpp

Print this page
rev 10739 : 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
Reviewed-by:


1073     add_to_discovered_list_mt(*list, obj, discovered_addr);
1074   } else {
1075     // We do a raw store here: the field will be visited later when processing
1076     // the discovered references.
1077     oop current_head = list->head();
1078     // The last ref must have its discovered field pointing to itself.
1079     oop next_discovered = (current_head != NULL) ? current_head : obj;
1080 
1081     assert(discovered == NULL, "control point invariant");
1082     oop_store_raw(discovered_addr, next_discovered);
1083     list->set_head(obj);
1084     list->inc_length(1);
1085 
1086     log_develop_trace(gc, ref)("Discovered reference (" INTPTR_FORMAT ": %s)", p2i(obj), obj->klass()->internal_name());
1087   }
1088   assert(obj->is_oop(), "Discovered a bad reference");
1089   verify_referent(obj);
1090   return true;
1091 }
1092 









1093 // Preclean the discovered references by removing those
1094 // whose referents are alive, and by marking from those that
1095 // are not active. These lists can be handled here
1096 // in any order and, indeed, concurrently.
1097 void ReferenceProcessor::preclean_discovered_references(
1098   BoolObjectClosure* is_alive,
1099   OopClosure* keep_alive,
1100   VoidClosure* complete_gc,
1101   YieldClosure* yield,
1102   GCTimer* gc_timer) {
1103 
1104   // Soft references
1105   {
1106     GCTraceTime(Debug, gc, ref) tm("Preclean SoftReferences", gc_timer);
1107     for (uint i = 0; i < _max_num_q; i++) {
1108       if (yield->should_return()) {
1109         return;
1110       }
1111       preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive,
1112                                   keep_alive, complete_gc, yield);




1073     add_to_discovered_list_mt(*list, obj, discovered_addr);
1074   } else {
1075     // We do a raw store here: the field will be visited later when processing
1076     // the discovered references.
1077     oop current_head = list->head();
1078     // The last ref must have its discovered field pointing to itself.
1079     oop next_discovered = (current_head != NULL) ? current_head : obj;
1080 
1081     assert(discovered == NULL, "control point invariant");
1082     oop_store_raw(discovered_addr, next_discovered);
1083     list->set_head(obj);
1084     list->inc_length(1);
1085 
1086     log_develop_trace(gc, ref)("Discovered reference (" INTPTR_FORMAT ": %s)", p2i(obj), obj->klass()->internal_name());
1087   }
1088   assert(obj->is_oop(), "Discovered a bad reference");
1089   verify_referent(obj);
1090   return true;
1091 }
1092 
1093 bool ReferenceProcessor::has_discovered_references() {
1094   for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
1095     if (!_discovered_refs[i].is_empty()) {
1096       return true;
1097     }
1098   }
1099   return false;
1100 }
1101 
1102 // Preclean the discovered references by removing those
1103 // whose referents are alive, and by marking from those that
1104 // are not active. These lists can be handled here
1105 // in any order and, indeed, concurrently.
1106 void ReferenceProcessor::preclean_discovered_references(
1107   BoolObjectClosure* is_alive,
1108   OopClosure* keep_alive,
1109   VoidClosure* complete_gc,
1110   YieldClosure* yield,
1111   GCTimer* gc_timer) {
1112 
1113   // Soft references
1114   {
1115     GCTraceTime(Debug, gc, ref) tm("Preclean SoftReferences", gc_timer);
1116     for (uint i = 0; i < _max_num_q; i++) {
1117       if (yield->should_return()) {
1118         return;
1119       }
1120       preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive,
1121                                   keep_alive, complete_gc, yield);


< prev index next >