hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp
changeset 34311 586e90e84d60
parent 34310 32e3c906b613
child 34313 31ee2fd5ae1d
equal deleted inserted replaced
34310:32e3c906b613 34311:586e90e84d60
    34 #include "gc/g1/g1Allocator.inline.hpp"
    34 #include "gc/g1/g1Allocator.inline.hpp"
    35 #include "gc/g1/g1CollectedHeap.inline.hpp"
    35 #include "gc/g1/g1CollectedHeap.inline.hpp"
    36 #include "gc/g1/g1CollectorPolicy.hpp"
    36 #include "gc/g1/g1CollectorPolicy.hpp"
    37 #include "gc/g1/g1CollectorState.hpp"
    37 #include "gc/g1/g1CollectorState.hpp"
    38 #include "gc/g1/g1ErgoVerbose.hpp"
    38 #include "gc/g1/g1ErgoVerbose.hpp"
    39 #include "gc/g1/g1EvacFailure.hpp"
       
    40 #include "gc/g1/g1EvacStats.inline.hpp"
    39 #include "gc/g1/g1EvacStats.inline.hpp"
    41 #include "gc/g1/g1GCPhaseTimes.hpp"
    40 #include "gc/g1/g1GCPhaseTimes.hpp"
    42 #include "gc/g1/g1Log.hpp"
    41 #include "gc/g1/g1Log.hpp"
    43 #include "gc/g1/g1MarkSweep.hpp"
    42 #include "gc/g1/g1MarkSweep.hpp"
    44 #include "gc/g1/g1OopClosures.inline.hpp"
    43 #include "gc/g1/g1OopClosures.inline.hpp"
  4088   }
  4087   }
  4089 
  4088 
  4090   return true;
  4089   return true;
  4091 }
  4090 }
  4092 
  4091 
       
  4092 void G1CollectedHeap::restore_preserved_marks() {
       
  4093   G1RestorePreservedMarksTask rpm_task(_preserved_objs);
       
  4094   workers()->run_task(&rpm_task);
       
  4095 }
       
  4096 
  4093 void G1CollectedHeap::remove_self_forwarding_pointers() {
  4097 void G1CollectedHeap::remove_self_forwarding_pointers() {
  4094   double remove_self_forwards_start = os::elapsedTime();
       
  4095 
       
  4096   G1ParRemoveSelfForwardPtrsTask rsfp_task;
  4098   G1ParRemoveSelfForwardPtrsTask rsfp_task;
  4097   workers()->run_task(&rsfp_task);
  4099   workers()->run_task(&rsfp_task);
  4098 
  4100 }
  4099   // Now restore saved marks, if any.
  4101 
  4100   for (uint i = 0; i < ParallelGCThreads; i++) {
  4102 void G1CollectedHeap::restore_after_evac_failure() {
  4101     OopAndMarkOopStack& cur = _preserved_objs[i];
  4103   double remove_self_forwards_start = os::elapsedTime();
  4102     while (!cur.is_empty()) {
  4104 
  4103       OopAndMarkOop elem = cur.pop();
  4105   remove_self_forwarding_pointers();
  4104       elem.set_mark();
  4106   restore_preserved_marks();
  4105     }
       
  4106     cur.clear(true);
       
  4107   }
       
  4108 
  4107 
  4109   g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
  4108   g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
  4110 }
  4109 }
  4111 
  4110 
  4112 void G1CollectedHeap::preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m) {
  4111 void G1CollectedHeap::preserve_mark_during_evac_failure(uint worker_id, oop obj, markOop m) {
  5191   }
  5190   }
  5192 
  5191 
  5193   g1_rem_set()->cleanup_after_oops_into_collection_set_do();
  5192   g1_rem_set()->cleanup_after_oops_into_collection_set_do();
  5194 
  5193 
  5195   if (evacuation_failed()) {
  5194   if (evacuation_failed()) {
  5196     remove_self_forwarding_pointers();
  5195     restore_after_evac_failure();
  5197 
  5196 
  5198     // Reset the G1EvacuationFailureALot counters and flags
  5197     // Reset the G1EvacuationFailureALot counters and flags
  5199     // Note: the values are reset only when an actual
  5198     // Note: the values are reset only when an actual
  5200     // evacuation failure occurs.
  5199     // evacuation failure occurs.
  5201     NOT_PRODUCT(reset_evacuation_should_fail();)
  5200     NOT_PRODUCT(reset_evacuation_should_fail();)