< prev index next >

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

Print this page
rev 51898 : 8211228: Zero build is broken after JDK-8196341 (Add JFR events for parallel phases of G1)
Reviewed-by: XXX


3152 void G1CollectedHeap::restore_after_evac_failure() {
3153   double remove_self_forwards_start = os::elapsedTime();
3154 
3155   remove_self_forwarding_pointers();
3156   SharedRestorePreservedMarksTaskExecutor task_executor(workers());
3157   _preserved_marks_set.restore(&task_executor);
3158 
3159   g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
3160 }
3161 
3162 void G1CollectedHeap::preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m) {
3163   if (!_evacuation_failed) {
3164     _evacuation_failed = true;
3165   }
3166 
3167   _evacuation_failed_info_array[worker_id].register_copy_failure(obj->size());
3168   _preserved_marks_set.get(worker_id)->push_if_necessary(obj, m);
3169 }
3170 
3171 bool G1ParEvacuateFollowersClosure::offer_termination() {
3172   EventGCPhaseParallel event;
3173   G1ParScanThreadState* const pss = par_scan_state();
3174   start_term_time();
3175   const bool res = terminator()->offer_termination();
3176   end_term_time();
3177   event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::Termination));
3178   return res;
3179 }
3180 
3181 void G1ParEvacuateFollowersClosure::do_void() {
3182   EventGCPhaseParallel event;
3183   G1ParScanThreadState* const pss = par_scan_state();
3184   pss->trim_queue();
3185   event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ObjCopy));
3186   do {
3187     EventGCPhaseParallel event;
3188     pss->steal_and_trim_queue(queues());
3189     event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ObjCopy));
3190   } while (!offer_termination());
3191 }
3192 
3193 class G1ParTask : public AbstractGangTask {
3194 protected:
3195   G1CollectedHeap*         _g1h;
3196   G1ParScanThreadStateSet* _pss;
3197   RefToScanQueueSet*       _queues;
3198   G1RootProcessor*         _root_processor;
3199   ParallelTaskTerminator   _terminator;
3200   uint                     _n_workers;
3201 
3202 public:
3203   G1ParTask(G1CollectedHeap* g1h, G1ParScanThreadStateSet* per_thread_states, RefToScanQueueSet *task_queues, G1RootProcessor* root_processor, uint n_workers)
3204     : AbstractGangTask("G1 collection"),
3205       _g1h(g1h),
3206       _pss(per_thread_states),
3207       _queues(task_queues),
3208       _root_processor(root_processor),
3209       _terminator(n_workers, _queues),


4039         double serial_time = os::elapsedTime();
4040         do_serial_work();
4041         timer->record_serial_free_cset_time_ms((os::elapsedTime() - serial_time) * 1000.0);
4042       }
4043     }
4044 
4045     // Start parallel work.
4046     double young_time = 0.0;
4047     bool has_young_time = false;
4048     double non_young_time = 0.0;
4049     bool has_non_young_time = false;
4050 
4051     while (true) {
4052       size_t end = Atomic::add(chunk_size(), &_parallel_work_claim);
4053       size_t cur = end - chunk_size();
4054 
4055       if (cur >= _num_work_items) {
4056         break;
4057       }
4058 
4059       EventGCPhaseParallel event;
4060       double start_time = os::elapsedTime();
4061 
4062       end = MIN2(end, _num_work_items);
4063 
4064       for (; cur < end; cur++) {
4065         bool is_young = _work_items[cur].is_young;
4066 
4067         do_parallel_work_for_region(_work_items[cur].region_idx, is_young, _work_items[cur].evacuation_failed);
4068 
4069         double end_time = os::elapsedTime();
4070         double time_taken = end_time - start_time;
4071         if (is_young) {
4072           young_time += time_taken;
4073           has_young_time = true;
4074           event.commit(GCId::current(), worker_id, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::YoungFreeCSet));
4075         } else {
4076           non_young_time += time_taken;
4077           has_non_young_time = true;
4078           event.commit(GCId::current(), worker_id, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::NonYoungFreeCSet));
4079         }
4080         start_time = end_time;
4081       }
4082     }
4083 
4084     if (has_young_time) {
4085       timer->record_time_secs(G1GCPhaseTimes::YoungFreeCSet, worker_id, young_time);
4086     }
4087     if (has_non_young_time) {
4088       timer->record_time_secs(G1GCPhaseTimes::NonYoungFreeCSet, worker_id, non_young_time);
4089     }
4090   }
4091 };
4092 
4093 void G1CollectedHeap::free_collection_set(G1CollectionSet* collection_set, EvacuationInfo& evacuation_info, const size_t* surviving_young_words) {
4094   _eden.clear();
4095 
4096   double free_cset_start_time = os::elapsedTime();
4097 
4098   {




3152 void G1CollectedHeap::restore_after_evac_failure() {
3153   double remove_self_forwards_start = os::elapsedTime();
3154 
3155   remove_self_forwarding_pointers();
3156   SharedRestorePreservedMarksTaskExecutor task_executor(workers());
3157   _preserved_marks_set.restore(&task_executor);
3158 
3159   g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
3160 }
3161 
3162 void G1CollectedHeap::preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m) {
3163   if (!_evacuation_failed) {
3164     _evacuation_failed = true;
3165   }
3166 
3167   _evacuation_failed_info_array[worker_id].register_copy_failure(obj->size());
3168   _preserved_marks_set.get(worker_id)->push_if_necessary(obj, m);
3169 }
3170 
3171 bool G1ParEvacuateFollowersClosure::offer_termination() {
3172   JFR_ONLY(EventGCPhaseParallel event;)
3173   G1ParScanThreadState* const pss = par_scan_state();
3174   start_term_time();
3175   const bool res = terminator()->offer_termination();
3176   end_term_time();
3177   JFR_ONLY(event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::Termination));)
3178   return res;
3179 }
3180 
3181 void G1ParEvacuateFollowersClosure::do_void() {
3182   JFR_ONLY(EventGCPhaseParallel event;)
3183   G1ParScanThreadState* const pss = par_scan_state();
3184   pss->trim_queue();
3185   JFR_ONLY(event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ObjCopy));)
3186   do {
3187     JFR_ONLY(EventGCPhaseParallel event;)
3188     pss->steal_and_trim_queue(queues());
3189     JFR_ONLY(event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ObjCopy));)
3190   } while (!offer_termination());
3191 }
3192 
3193 class G1ParTask : public AbstractGangTask {
3194 protected:
3195   G1CollectedHeap*         _g1h;
3196   G1ParScanThreadStateSet* _pss;
3197   RefToScanQueueSet*       _queues;
3198   G1RootProcessor*         _root_processor;
3199   ParallelTaskTerminator   _terminator;
3200   uint                     _n_workers;
3201 
3202 public:
3203   G1ParTask(G1CollectedHeap* g1h, G1ParScanThreadStateSet* per_thread_states, RefToScanQueueSet *task_queues, G1RootProcessor* root_processor, uint n_workers)
3204     : AbstractGangTask("G1 collection"),
3205       _g1h(g1h),
3206       _pss(per_thread_states),
3207       _queues(task_queues),
3208       _root_processor(root_processor),
3209       _terminator(n_workers, _queues),


4039         double serial_time = os::elapsedTime();
4040         do_serial_work();
4041         timer->record_serial_free_cset_time_ms((os::elapsedTime() - serial_time) * 1000.0);
4042       }
4043     }
4044 
4045     // Start parallel work.
4046     double young_time = 0.0;
4047     bool has_young_time = false;
4048     double non_young_time = 0.0;
4049     bool has_non_young_time = false;
4050 
4051     while (true) {
4052       size_t end = Atomic::add(chunk_size(), &_parallel_work_claim);
4053       size_t cur = end - chunk_size();
4054 
4055       if (cur >= _num_work_items) {
4056         break;
4057       }
4058 
4059       JFR_ONLY(EventGCPhaseParallel event;)
4060       double start_time = os::elapsedTime();
4061 
4062       end = MIN2(end, _num_work_items);
4063 
4064       for (; cur < end; cur++) {
4065         bool is_young = _work_items[cur].is_young;
4066 
4067         do_parallel_work_for_region(_work_items[cur].region_idx, is_young, _work_items[cur].evacuation_failed);
4068 
4069         double end_time = os::elapsedTime();
4070         double time_taken = end_time - start_time;
4071         if (is_young) {
4072           young_time += time_taken;
4073           has_young_time = true;
4074           JFR_ONLY(event.commit(GCId::current(), worker_id, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::YoungFreeCSet));)
4075         } else {
4076           non_young_time += time_taken;
4077           has_non_young_time = true;
4078           JFR_ONLY(event.commit(GCId::current(), worker_id, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::NonYoungFreeCSet));)
4079         }
4080         start_time = end_time;
4081       }
4082     }
4083 
4084     if (has_young_time) {
4085       timer->record_time_secs(G1GCPhaseTimes::YoungFreeCSet, worker_id, young_time);
4086     }
4087     if (has_non_young_time) {
4088       timer->record_time_secs(G1GCPhaseTimes::NonYoungFreeCSet, worker_id, non_young_time);
4089     }
4090   }
4091 };
4092 
4093 void G1CollectedHeap::free_collection_set(G1CollectionSet* collection_set, EvacuationInfo& evacuation_info, const size_t* surviving_young_words) {
4094   _eden.clear();
4095 
4096   double free_cset_start_time = os::elapsedTime();
4097 
4098   {


< prev index next >