comparison src/share/vm/oops/markOop.inline.hpp @ 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 f95d63e2154a
children da91efe96a93
comparison
equal deleted inserted replaced
2037:b03260081e9b 2038:74ee0db180fa
28 #include "oops/klass.hpp" 28 #include "oops/klass.hpp"
29 #include "oops/klassOop.hpp" 29 #include "oops/klassOop.hpp"
30 #include "oops/markOop.hpp" 30 #include "oops/markOop.hpp"
31 #include "runtime/globals.hpp" 31 #include "runtime/globals.hpp"
32 32
33 // Should this header be preserved during GC? 33 // Should this header be preserved during GC (when biased locking is enabled)?
34 inline bool markOopDesc::must_be_preserved_with_bias(oop obj_containing_mark) const { 34 inline bool markOopDesc::must_be_preserved_with_bias(oop obj_containing_mark) const {
35 assert(UseBiasedLocking, "unexpected"); 35 assert(UseBiasedLocking, "unexpected");
36 if (has_bias_pattern()) { 36 if (has_bias_pattern()) {
37 // Will reset bias at end of collection 37 // Will reset bias at end of collection
38 // Mark words of biased and currently locked objects are preserved separately 38 // Mark words of biased and currently locked objects are preserved separately
45 return true; 45 return true;
46 } 46 }
47 return (!is_unlocked() || !has_no_hash()); 47 return (!is_unlocked() || !has_no_hash());
48 } 48 }
49 49
50 // Should this header be preserved during GC?
50 inline bool markOopDesc::must_be_preserved(oop obj_containing_mark) const { 51 inline bool markOopDesc::must_be_preserved(oop obj_containing_mark) const {
51 if (!UseBiasedLocking) 52 if (!UseBiasedLocking)
52 return (!is_unlocked() || !has_no_hash()); 53 return (!is_unlocked() || !has_no_hash());
53 return must_be_preserved_with_bias(obj_containing_mark); 54 return must_be_preserved_with_bias(obj_containing_mark);
54 } 55 }
55 56
56 // Should this header (including its age bits) be preserved in the 57 // Should this header be preserved in the case of a promotion failure
57 // case of a promotion failure during scavenge? 58 // during scavenge (when biased locking is enabled)?
58 inline bool markOopDesc::must_be_preserved_with_bias_for_promotion_failure(oop obj_containing_mark) const { 59 inline bool markOopDesc::must_be_preserved_with_bias_for_promotion_failure(oop obj_containing_mark) const {
59 assert(UseBiasedLocking, "unexpected"); 60 assert(UseBiasedLocking, "unexpected");
60 // We don't explicitly save off the mark words of biased and 61 // We don't explicitly save off the mark words of biased and
61 // currently-locked objects during scavenges, so if during a 62 // currently-locked objects during scavenges, so if during a
62 // promotion failure we encounter either a biased mark word or a 63 // promotion failure we encounter either a biased mark word or a
68 // of a scavenge when a promotion failure has first been detected. 69 // of a scavenge when a promotion failure has first been detected.
69 if (has_bias_pattern() || 70 if (has_bias_pattern() ||
70 prototype_for_object(obj_containing_mark)->has_bias_pattern()) { 71 prototype_for_object(obj_containing_mark)->has_bias_pattern()) {
71 return true; 72 return true;
72 } 73 }
73 return (this != prototype()); 74 return (!is_unlocked() || !has_no_hash());
74 } 75 }
75 76
77 // Should this header be preserved in the case of a promotion failure
78 // during scavenge?
76 inline bool markOopDesc::must_be_preserved_for_promotion_failure(oop obj_containing_mark) const { 79 inline bool markOopDesc::must_be_preserved_for_promotion_failure(oop obj_containing_mark) const {
77 if (!UseBiasedLocking) 80 if (!UseBiasedLocking)
78 return (this != prototype()); 81 return (!is_unlocked() || !has_no_hash());
79 return must_be_preserved_with_bias_for_promotion_failure(obj_containing_mark); 82 return must_be_preserved_with_bias_for_promotion_failure(obj_containing_mark);
80 } 83 }
81 84
82 85
83 // Should this header (including its age bits) be preserved in the 86 // Same as must_be_preserved_with_bias_for_promotion_failure() except that
84 // case of a scavenge in which CMS is the old generation? 87 // it takes a klassOop argument, instead of the object of which this is the mark word.
85 inline bool markOopDesc::must_be_preserved_with_bias_for_cms_scavenge(klassOop klass_of_obj_containing_mark) const { 88 inline bool markOopDesc::must_be_preserved_with_bias_for_cms_scavenge(klassOop klass_of_obj_containing_mark) const {
86 assert(UseBiasedLocking, "unexpected"); 89 assert(UseBiasedLocking, "unexpected");
87 // CMS scavenges preserve mark words in similar fashion to promotion failures; see above 90 // CMS scavenges preserve mark words in similar fashion to promotion failures; see above
88 if (has_bias_pattern() || 91 if (has_bias_pattern() ||
89 klass_of_obj_containing_mark->klass_part()->prototype_header()->has_bias_pattern()) { 92 klass_of_obj_containing_mark->klass_part()->prototype_header()->has_bias_pattern()) {
90 return true; 93 return true;
91 } 94 }
92 return (this != prototype()); 95 return (!is_unlocked() || !has_no_hash());
93 } 96 }
97
98 // Same as must_be_preserved_for_promotion_failure() except that
99 // it takes a klassOop argument, instead of the object of which this is the mark word.
94 inline bool markOopDesc::must_be_preserved_for_cms_scavenge(klassOop klass_of_obj_containing_mark) const { 100 inline bool markOopDesc::must_be_preserved_for_cms_scavenge(klassOop klass_of_obj_containing_mark) const {
95 if (!UseBiasedLocking) 101 if (!UseBiasedLocking)
96 return (this != prototype()); 102 return (!is_unlocked() || !has_no_hash());
97 return must_be_preserved_with_bias_for_cms_scavenge(klass_of_obj_containing_mark); 103 return must_be_preserved_with_bias_for_cms_scavenge(klass_of_obj_containing_mark);
98 } 104 }
99 105
100 inline markOop markOopDesc::prototype_for_object(oop obj) { 106 inline markOop markOopDesc::prototype_for_object(oop obj) {
101 #ifdef ASSERT 107 #ifdef ASSERT