70 // We must enqueue the object before it is marked
71 // as we otherwise can't read the object's age.
72 G1StringDedup::enqueue_from_mark(obj);
73 }
74 #endif
75 // some marks may contain information we need to preserve so we store them away
76 // and overwrite the mark. We'll restore it at the end of markSweep.
77 markOop mark = obj->mark();
78 obj->set_mark(markOopDesc::prototype()->set_marked());
79
80 if (mark->must_be_preserved(obj)) {
81 preserve_mark(obj, mark);
82 }
83 }
84
85 template <class T> inline void MarkSweep::mark_and_push(T* p) {
86 T heap_oop = oopDesc::load_heap_oop(p);
87 if (!oopDesc::is_null(heap_oop)) {
88 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
89 if (!obj->mark()->is_marked() &&
90 !is_archive_object(obj)) {
91 mark_object(obj);
92 _marking_stack.push(obj);
93 }
94 }
95 }
96
97 inline void MarkSweep::follow_klass(Klass* klass) {
98 oop op = klass->klass_holder();
99 MarkSweep::mark_and_push(&op);
100 }
101
102 inline void MarkSweep::follow_cld(ClassLoaderData* cld) {
103 MarkSweep::follow_cld_closure.do_cld(cld);
104 }
105
106 template <typename T>
107 inline void MarkAndPushClosure::do_oop_nv(T* p) { MarkSweep::mark_and_push(p); }
108 void MarkAndPushClosure::do_oop(oop* p) { do_oop_nv(p); }
109 void MarkAndPushClosure::do_oop(narrowOop* p) { do_oop_nv(p); }
110 inline bool MarkAndPushClosure::do_metadata_nv() { return true; }
167 }
168 // Process ObjArrays one at a time to avoid marking stack bloat.
169 if (!_objarray_stack.is_empty()) {
170 ObjArrayTask task = _objarray_stack.pop();
171 follow_array_chunk(objArrayOop(task.obj()), task.index());
172 }
173 } while (!_marking_stack.is_empty() || !_objarray_stack.is_empty());
174 }
175
176 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure;
177
178 void MarkSweep::FollowStackClosure::do_void() { follow_stack(); }
179
180 template <class T> inline void MarkSweep::follow_root(T* p) {
181 assert(!Universe::heap()->is_in_reserved(p),
182 "roots shouldn't be things within the heap");
183 T heap_oop = oopDesc::load_heap_oop(p);
184 if (!oopDesc::is_null(heap_oop)) {
185 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
186 if (!obj->mark()->is_marked() &&
187 !is_archive_object(obj)) {
188 mark_object(obj);
189 follow_object(obj);
190 }
191 }
192 follow_stack();
193 }
194
195 void MarkSweep::FollowRootClosure::do_oop(oop* p) { follow_root(p); }
196 void MarkSweep::FollowRootClosure::do_oop(narrowOop* p) { follow_root(p); }
197
198 void PreservedMark::adjust_pointer() {
199 MarkSweep::adjust_pointer(&_obj);
200 }
201
202 void PreservedMark::restore() {
203 _obj->set_mark(_mark);
204 }
205
206 // We preserve the mark which should be replaced at the end and the location
207 // that it will go. Note that the object that this markOop belongs to isn't
251 void MarkSweep::restore_marks() {
252 assert(_preserved_oop_stack.size() == _preserved_mark_stack.size(),
253 "inconsistent preserved oop stacks");
254 log_trace(gc)("Restoring " SIZE_FORMAT " marks", _preserved_count + _preserved_oop_stack.size());
255
256 // restore the marks we saved earlier
257 for (size_t i = 0; i < _preserved_count; i++) {
258 _preserved_marks[i].restore();
259 }
260
261 // deal with the overflow
262 while (!_preserved_oop_stack.is_empty()) {
263 oop obj = _preserved_oop_stack.pop();
264 markOop mark = _preserved_mark_stack.pop();
265 obj->set_mark(mark);
266 }
267 }
268
269 MarkSweep::IsAliveClosure MarkSweep::is_alive;
270
271 bool MarkSweep::IsAliveClosure::do_object_b(oop p) { return p->is_gc_marked() || is_archive_object(p); }
272
273 MarkSweep::KeepAliveClosure MarkSweep::keep_alive;
274
275 void MarkSweep::KeepAliveClosure::do_oop(oop* p) { MarkSweep::KeepAliveClosure::do_oop_work(p); }
276 void MarkSweep::KeepAliveClosure::do_oop(narrowOop* p) { MarkSweep::KeepAliveClosure::do_oop_work(p); }
277
278 void marksweep_init() {
279 MarkSweep::_gc_timer = new (ResourceObj::C_HEAP, mtGC) STWGCTimer();
280 MarkSweep::_gc_tracer = new (ResourceObj::C_HEAP, mtGC) SerialOldTracer();
281 }
282
283 // Generate MS specialized oop_oop_iterate functions.
284 SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_MS(ALL_KLASS_OOP_OOP_ITERATE_DEFN)
|
70 // We must enqueue the object before it is marked
71 // as we otherwise can't read the object's age.
72 G1StringDedup::enqueue_from_mark(obj);
73 }
74 #endif
75 // some marks may contain information we need to preserve so we store them away
76 // and overwrite the mark. We'll restore it at the end of markSweep.
77 markOop mark = obj->mark();
78 obj->set_mark(markOopDesc::prototype()->set_marked());
79
80 if (mark->must_be_preserved(obj)) {
81 preserve_mark(obj, mark);
82 }
83 }
84
85 template <class T> inline void MarkSweep::mark_and_push(T* p) {
86 T heap_oop = oopDesc::load_heap_oop(p);
87 if (!oopDesc::is_null(heap_oop)) {
88 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
89 if (!obj->mark()->is_marked() &&
90 !is_closed_archive_object(obj)) {
91 mark_object(obj);
92 _marking_stack.push(obj);
93 }
94 }
95 }
96
97 inline void MarkSweep::follow_klass(Klass* klass) {
98 oop op = klass->klass_holder();
99 MarkSweep::mark_and_push(&op);
100 }
101
102 inline void MarkSweep::follow_cld(ClassLoaderData* cld) {
103 MarkSweep::follow_cld_closure.do_cld(cld);
104 }
105
106 template <typename T>
107 inline void MarkAndPushClosure::do_oop_nv(T* p) { MarkSweep::mark_and_push(p); }
108 void MarkAndPushClosure::do_oop(oop* p) { do_oop_nv(p); }
109 void MarkAndPushClosure::do_oop(narrowOop* p) { do_oop_nv(p); }
110 inline bool MarkAndPushClosure::do_metadata_nv() { return true; }
167 }
168 // Process ObjArrays one at a time to avoid marking stack bloat.
169 if (!_objarray_stack.is_empty()) {
170 ObjArrayTask task = _objarray_stack.pop();
171 follow_array_chunk(objArrayOop(task.obj()), task.index());
172 }
173 } while (!_marking_stack.is_empty() || !_objarray_stack.is_empty());
174 }
175
176 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure;
177
178 void MarkSweep::FollowStackClosure::do_void() { follow_stack(); }
179
180 template <class T> inline void MarkSweep::follow_root(T* p) {
181 assert(!Universe::heap()->is_in_reserved(p),
182 "roots shouldn't be things within the heap");
183 T heap_oop = oopDesc::load_heap_oop(p);
184 if (!oopDesc::is_null(heap_oop)) {
185 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
186 if (!obj->mark()->is_marked() &&
187 !is_closed_archive_object(obj)) {
188 mark_object(obj);
189 follow_object(obj);
190 }
191 }
192 follow_stack();
193 }
194
195 void MarkSweep::FollowRootClosure::do_oop(oop* p) { follow_root(p); }
196 void MarkSweep::FollowRootClosure::do_oop(narrowOop* p) { follow_root(p); }
197
198 void PreservedMark::adjust_pointer() {
199 MarkSweep::adjust_pointer(&_obj);
200 }
201
202 void PreservedMark::restore() {
203 _obj->set_mark(_mark);
204 }
205
206 // We preserve the mark which should be replaced at the end and the location
207 // that it will go. Note that the object that this markOop belongs to isn't
251 void MarkSweep::restore_marks() {
252 assert(_preserved_oop_stack.size() == _preserved_mark_stack.size(),
253 "inconsistent preserved oop stacks");
254 log_trace(gc)("Restoring " SIZE_FORMAT " marks", _preserved_count + _preserved_oop_stack.size());
255
256 // restore the marks we saved earlier
257 for (size_t i = 0; i < _preserved_count; i++) {
258 _preserved_marks[i].restore();
259 }
260
261 // deal with the overflow
262 while (!_preserved_oop_stack.is_empty()) {
263 oop obj = _preserved_oop_stack.pop();
264 markOop mark = _preserved_mark_stack.pop();
265 obj->set_mark(mark);
266 }
267 }
268
269 MarkSweep::IsAliveClosure MarkSweep::is_alive;
270
271 bool MarkSweep::IsAliveClosure::do_object_b(oop p) { return p->is_gc_marked() || is_closed_archive_object(p); }
272
273 MarkSweep::KeepAliveClosure MarkSweep::keep_alive;
274
275 void MarkSweep::KeepAliveClosure::do_oop(oop* p) { MarkSweep::KeepAliveClosure::do_oop_work(p); }
276 void MarkSweep::KeepAliveClosure::do_oop(narrowOop* p) { MarkSweep::KeepAliveClosure::do_oop_work(p); }
277
278 void marksweep_init() {
279 MarkSweep::_gc_timer = new (ResourceObj::C_HEAP, mtGC) STWGCTimer();
280 MarkSweep::_gc_tracer = new (ResourceObj::C_HEAP, mtGC) SerialOldTracer();
281 }
282
283 // Generate MS specialized oop_oop_iterate functions.
284 SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_MS(ALL_KLASS_OOP_OOP_ITERATE_DEFN)
|