Mercurial > hg > graal-jvmci-8
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 = |