35 #include "oops/objArrayKlass.inline.hpp" |
35 #include "oops/objArrayKlass.inline.hpp" |
36 #include "utilities/macros.hpp" |
36 #include "utilities/macros.hpp" |
37 #include "utilities/stack.inline.hpp" |
37 #include "utilities/stack.inline.hpp" |
38 #if INCLUDE_ALL_GCS |
38 #if INCLUDE_ALL_GCS |
39 #include "gc/g1/g1StringDedup.hpp" |
39 #include "gc/g1/g1StringDedup.hpp" |
|
40 #include "gc/g1/g1MarkSweep.hpp" |
40 #endif // INCLUDE_ALL_GCS |
41 #endif // INCLUDE_ALL_GCS |
41 |
42 |
42 inline void MarkSweep::mark_object(oop obj) { |
43 inline void MarkSweep::mark_object(oop obj) { |
43 #if INCLUDE_ALL_GCS |
44 #if INCLUDE_ALL_GCS |
44 if (G1StringDedup::is_enabled()) { |
45 if (G1StringDedup::is_enabled()) { |
55 if (mark->must_be_preserved(obj)) { |
56 if (mark->must_be_preserved(obj)) { |
56 preserve_mark(obj, mark); |
57 preserve_mark(obj, mark); |
57 } |
58 } |
58 } |
59 } |
59 |
60 |
|
61 inline bool MarkSweep::is_archive_object(oop object) { |
|
62 #if INCLUDE_ALL_GCS |
|
63 return (G1MarkSweep::archive_check_enabled() && |
|
64 G1MarkSweep::in_archive_range(object)); |
|
65 #else |
|
66 return false; |
|
67 #endif |
|
68 } |
|
69 |
60 inline void MarkSweep::follow_klass(Klass* klass) { |
70 inline void MarkSweep::follow_klass(Klass* klass) { |
61 oop op = klass->klass_holder(); |
71 oop op = klass->klass_holder(); |
62 MarkSweep::mark_and_push(&op); |
72 MarkSweep::mark_and_push(&op); |
63 } |
73 } |
64 |
74 |
72 assert(!Universe::heap()->is_in_reserved(p), |
82 assert(!Universe::heap()->is_in_reserved(p), |
73 "roots shouldn't be things within the heap"); |
83 "roots shouldn't be things within the heap"); |
74 T heap_oop = oopDesc::load_heap_oop(p); |
84 T heap_oop = oopDesc::load_heap_oop(p); |
75 if (!oopDesc::is_null(heap_oop)) { |
85 if (!oopDesc::is_null(heap_oop)) { |
76 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
86 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
77 if (!obj->mark()->is_marked()) { |
87 if (!obj->mark()->is_marked() && |
|
88 !is_archive_object(obj)) { |
78 mark_object(obj); |
89 mark_object(obj); |
79 follow_object(obj); |
90 follow_object(obj); |
80 } |
91 } |
81 } |
92 } |
82 follow_stack(); |
93 follow_stack(); |
85 template <class T> inline void MarkSweep::mark_and_push(T* p) { |
96 template <class T> inline void MarkSweep::mark_and_push(T* p) { |
86 // assert(Universe::heap()->is_in_reserved(p), "should be in object space"); |
97 // assert(Universe::heap()->is_in_reserved(p), "should be in object space"); |
87 T heap_oop = oopDesc::load_heap_oop(p); |
98 T heap_oop = oopDesc::load_heap_oop(p); |
88 if (!oopDesc::is_null(heap_oop)) { |
99 if (!oopDesc::is_null(heap_oop)) { |
89 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
100 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
90 if (!obj->mark()->is_marked()) { |
101 if (!obj->mark()->is_marked() && |
|
102 !is_archive_object(obj)) { |
91 mark_object(obj); |
103 mark_object(obj); |
92 _marking_stack.push(obj); |
104 _marking_stack.push(obj); |
93 } |
105 } |
94 } |
106 } |
95 } |
107 } |
109 if (!oopDesc::is_null(heap_oop)) { |
121 if (!oopDesc::is_null(heap_oop)) { |
110 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
122 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
111 assert(Universe::heap()->is_in(obj), "should be in heap"); |
123 assert(Universe::heap()->is_in(obj), "should be in heap"); |
112 |
124 |
113 oop new_obj = oop(obj->mark()->decode_pointer()); |
125 oop new_obj = oop(obj->mark()->decode_pointer()); |
114 assert(new_obj != NULL || // is forwarding ptr? |
126 assert(is_archive_object(obj) || // no forwarding of archive objects |
|
127 new_obj != NULL || // is forwarding ptr? |
115 obj->mark() == markOopDesc::prototype() || // not gc marked? |
128 obj->mark() == markOopDesc::prototype() || // not gc marked? |
116 (UseBiasedLocking && obj->mark()->has_bias_pattern()), |
129 (UseBiasedLocking && obj->mark()->has_bias_pattern()), |
117 // not gc marked? |
130 // not gc marked? |
118 "should be forwarded"); |
131 "should be forwarded"); |
119 if (new_obj != NULL) { |
132 if (new_obj != NULL) { |
120 assert(Universe::heap()->is_in_reserved(new_obj), |
133 if (!is_archive_object(obj)) { |
121 "should be in object space"); |
134 assert(Universe::heap()->is_in_reserved(new_obj), |
122 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
135 "should be in object space"); |
|
136 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
|
137 } |
123 } |
138 } |
124 } |
139 } |
125 } |
140 } |
126 |
141 |
127 template <class T> inline void MarkSweep::KeepAliveClosure::do_oop_work(T* p) { |
142 template <class T> inline void MarkSweep::KeepAliveClosure::do_oop_work(T* p) { |