comparison src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 2038:74ee0db180fa

6807801: CMS: could save/restore fewer header words during scavenge Summary: Age bits need not enter the mark-word preservation calculus; also affected, in addition to CMS, per CR synopsis above, were ParNew (but not DefNew), ParallelScavenge and G1, albeit to a lesser degree than CMS. Reviewed-by: tonyp, johnc
author ysr
date Fri, 17 Dec 2010 23:41:31 -0800
parents b03260081e9b
children 7c5250dbd584
comparison
equal deleted inserted replaced
2037:b03260081e9b 2038:74ee0db180fa
3956 assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!"); 3956 assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!");
3957 3957
3958 // Now restore saved marks, if any. 3958 // Now restore saved marks, if any.
3959 if (_objs_with_preserved_marks != NULL) { 3959 if (_objs_with_preserved_marks != NULL) {
3960 assert(_preserved_marks_of_objs != NULL, "Both or none."); 3960 assert(_preserved_marks_of_objs != NULL, "Both or none.");
3961 assert(_objs_with_preserved_marks->length() ==
3962 _preserved_marks_of_objs->length(), "Both or none.");
3963 guarantee(_objs_with_preserved_marks->length() == 3961 guarantee(_objs_with_preserved_marks->length() ==
3964 _preserved_marks_of_objs->length(), "Both or none."); 3962 _preserved_marks_of_objs->length(), "Both or none.");
3965 for (int i = 0; i < _objs_with_preserved_marks->length(); i++) { 3963 for (int i = 0; i < _objs_with_preserved_marks->length(); i++) {
3966 oop obj = _objs_with_preserved_marks->at(i); 3964 oop obj = _objs_with_preserved_marks->at(i);
3967 markOop m = _preserved_marks_of_objs->at(i); 3965 markOop m = _preserved_marks_of_objs->at(i);
4052 _drain_in_progress = false; 4050 _drain_in_progress = false;
4053 } 4051 }
4054 } 4052 }
4055 4053
4056 void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) { 4054 void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) {
4057 if (m != markOopDesc::prototype()) { 4055 assert(evacuation_failed(), "Oversaving!");
4056 // We want to call the "for_promotion_failure" version only in the
4057 // case of a promotion failure.
4058 if (m->must_be_preserved_for_promotion_failure(obj)) {
4058 if (_objs_with_preserved_marks == NULL) { 4059 if (_objs_with_preserved_marks == NULL) {
4059 assert(_preserved_marks_of_objs == NULL, "Both or none."); 4060 assert(_preserved_marks_of_objs == NULL, "Both or none.");
4060 _objs_with_preserved_marks = 4061 _objs_with_preserved_marks =
4061 new (ResourceObj::C_HEAP) GrowableArray<oop>(40, true); 4062 new (ResourceObj::C_HEAP) GrowableArray<oop>(40, true);
4062 _preserved_marks_of_objs = 4063 _preserved_marks_of_objs =