comparison src/share/vm/gc_implementation/shared/markSweep.cpp @ 1311:2a1472c30599

4396719: Mark Sweep stack overflow on deeply nested Object arrays Summary: Use an explicit stack for object arrays and process them in chunks. Reviewed-by: iveresov, apetrusenko
author jcoomes
date Wed, 03 Mar 2010 14:48:26 -0800
parents a1423fe86a18
children c385bf94cfb8
comparison
equal deleted inserted replaced
1289:d47555d7aca8 1311:2a1472c30599
23 */ 23 */
24 24
25 #include "incls/_precompiled.incl" 25 #include "incls/_precompiled.incl"
26 #include "incls/_markSweep.cpp.incl" 26 #include "incls/_markSweep.cpp.incl"
27 27
28 GrowableArray<oop>* MarkSweep::_marking_stack = NULL; 28 GrowableArray<oop>* MarkSweep::_marking_stack = NULL;
29 GrowableArray<Klass*>* MarkSweep::_revisit_klass_stack = NULL; 29 GrowableArray<ObjArrayTask>* MarkSweep::_objarray_stack = NULL;
30 GrowableArray<Klass*>* MarkSweep::_revisit_klass_stack = NULL;
30 GrowableArray<DataLayout*>* MarkSweep::_revisit_mdo_stack = NULL; 31 GrowableArray<DataLayout*>* MarkSweep::_revisit_mdo_stack = NULL;
31 32
32 GrowableArray<oop>* MarkSweep::_preserved_oop_stack = NULL; 33 GrowableArray<oop>* MarkSweep::_preserved_oop_stack = NULL;
33 GrowableArray<markOop>* MarkSweep::_preserved_mark_stack= NULL; 34 GrowableArray<markOop>* MarkSweep::_preserved_mark_stack= NULL;
34 size_t MarkSweep::_preserved_count = 0; 35 size_t MarkSweep::_preserved_count = 0;
102 103
103 void MarkSweep::MarkAndPushClosure::do_oop(oop* p) { mark_and_push(p); } 104 void MarkSweep::MarkAndPushClosure::do_oop(oop* p) { mark_and_push(p); }
104 void MarkSweep::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(p); } 105 void MarkSweep::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(p); }
105 106
106 void MarkSweep::follow_stack() { 107 void MarkSweep::follow_stack() {
107 while (!_marking_stack->is_empty()) { 108 do {
108 oop obj = _marking_stack->pop(); 109 while (!_marking_stack->is_empty()) {
109 assert (obj->is_gc_marked(), "p must be marked"); 110 oop obj = _marking_stack->pop();
110 obj->follow_contents(); 111 assert (obj->is_gc_marked(), "p must be marked");
111 } 112 obj->follow_contents();
113 }
114 while (!_objarray_stack->is_empty()) {
115 ObjArrayTask task = _objarray_stack->pop();
116 objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
117 k->oop_follow_contents(task.obj(), task.index());
118 }
119 } while (!_marking_stack->is_empty() || !_objarray_stack->is_empty());
112 } 120 }
113 121
114 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure; 122 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure;
115 123
116 void MarkSweep::FollowStackClosure::do_void() { follow_stack(); } 124 void MarkSweep::FollowStackClosure::do_void() { follow_stack(); }