62 |
62 |
63 void MarkSweep::follow_class_loader(ClassLoaderData* cld) { |
63 void MarkSweep::follow_class_loader(ClassLoaderData* cld) { |
64 MarkSweep::follow_cld_closure.do_cld(cld); |
64 MarkSweep::follow_cld_closure.do_cld(cld); |
65 } |
65 } |
66 |
66 |
|
67 void MarkSweep::follow_array(objArrayOop array, int index) { |
|
68 ObjArrayKlass* k = (ObjArrayKlass*)array->klass(); |
|
69 k->oop_follow_contents(array, index); |
|
70 } |
|
71 |
67 void MarkSweep::follow_stack() { |
72 void MarkSweep::follow_stack() { |
68 do { |
73 do { |
69 while (!_marking_stack.is_empty()) { |
74 while (!_marking_stack.is_empty()) { |
70 oop obj = _marking_stack.pop(); |
75 oop obj = _marking_stack.pop(); |
71 assert (obj->is_gc_marked(), "p must be marked"); |
76 assert (obj->is_gc_marked(), "p must be marked"); |
72 obj->follow_contents(); |
77 follow_object(obj); |
73 } |
78 } |
74 // Process ObjArrays one at a time to avoid marking stack bloat. |
79 // Process ObjArrays one at a time to avoid marking stack bloat. |
75 if (!_objarray_stack.is_empty()) { |
80 if (!_objarray_stack.is_empty()) { |
76 ObjArrayTask task = _objarray_stack.pop(); |
81 ObjArrayTask task = _objarray_stack.pop(); |
77 ObjArrayKlass* k = (ObjArrayKlass*)task.obj()->klass(); |
82 follow_array(objArrayOop(task.obj()), task.index()); |
78 k->oop_follow_contents(task.obj(), task.index()); |
|
79 } |
83 } |
80 } while (!_marking_stack.is_empty() || !_objarray_stack.is_empty()); |
84 } while (!_marking_stack.is_empty() || !_objarray_stack.is_empty()); |
81 } |
85 } |
82 |
86 |
83 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure; |
87 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure; |