< prev index next >

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

Print this page




3457     // concurrently with us. Make sure that anything after
3458     // this point does not assume that we are the only GC thread
3459     // running. Note: of course, the actual marking work will
3460     // not start until the safepoint itself is released in
3461     // SuspendibleThreadSet::desynchronize().
3462     doConcurrentMark();
3463   }
3464 
3465   return true;
3466 }
3467 
3468 void G1CollectedHeap::remove_self_forwarding_pointers() {
3469   G1ParRemoveSelfForwardPtrsTask rsfp_task;
3470   workers()->run_task(&rsfp_task);
3471 }
3472 
3473 void G1CollectedHeap::restore_after_evac_failure() {
3474   double remove_self_forwards_start = os::elapsedTime();
3475 
3476   remove_self_forwarding_pointers();
3477   _preserved_marks_set.restore(workers());

3478 
3479   g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
3480 }
3481 
3482 void G1CollectedHeap::preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m) {
3483   if (!_evacuation_failed) {
3484     _evacuation_failed = true;
3485   }
3486 
3487   _evacuation_failed_info_array[worker_id].register_copy_failure(obj->size());
3488   _preserved_marks_set.get(worker_id)->push_if_necessary(obj, m);
3489 }
3490 
3491 bool G1ParEvacuateFollowersClosure::offer_termination() {
3492   G1ParScanThreadState* const pss = par_scan_state();
3493   start_term_time();
3494   const bool res = terminator()->offer_termination();
3495   end_term_time();
3496   return res;
3497 }




3457     // concurrently with us. Make sure that anything after
3458     // this point does not assume that we are the only GC thread
3459     // running. Note: of course, the actual marking work will
3460     // not start until the safepoint itself is released in
3461     // SuspendibleThreadSet::desynchronize().
3462     doConcurrentMark();
3463   }
3464 
3465   return true;
3466 }
3467 
3468 void G1CollectedHeap::remove_self_forwarding_pointers() {
3469   G1ParRemoveSelfForwardPtrsTask rsfp_task;
3470   workers()->run_task(&rsfp_task);
3471 }
3472 
3473 void G1CollectedHeap::restore_after_evac_failure() {
3474   double remove_self_forwards_start = os::elapsedTime();
3475 
3476   remove_self_forwarding_pointers();
3477   SharedRestorePreservedMarksTaskExecutor task_executor(workers());
3478   _preserved_marks_set.restore(&task_executor);
3479 
3480   g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
3481 }
3482 
3483 void G1CollectedHeap::preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m) {
3484   if (!_evacuation_failed) {
3485     _evacuation_failed = true;
3486   }
3487 
3488   _evacuation_failed_info_array[worker_id].register_copy_failure(obj->size());
3489   _preserved_marks_set.get(worker_id)->push_if_necessary(obj, m);
3490 }
3491 
3492 bool G1ParEvacuateFollowersClosure::offer_termination() {
3493   G1ParScanThreadState* const pss = par_scan_state();
3494   start_term_time();
3495   const bool res = terminator()->offer_termination();
3496   end_term_time();
3497   return res;
3498 }


< prev index next >