equal
deleted
inserted
replaced
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();) |