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