Mercurial > hg > graal-compiler
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 |