161 void MarkSweep::follow_stack() {
162 do {
163 while (!_marking_stack.is_empty()) {
164 oop obj = _marking_stack.pop();
165 assert (obj->is_gc_marked(), "p must be marked");
166 follow_object(obj);
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
|
161 void MarkSweep::follow_stack() {
162 do {
163 while (!_marking_stack.is_empty()) {
164 oop obj = _marking_stack.pop();
165 assert (obj->is_gc_marked(), "p must be marked");
166 follow_object(obj);
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(!GC::gc()->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
|